Mi querido C...

zildjian

Hola MVeros. Tengo que crear un programa que haga lo siguiente: el primer parámetro es un char y el 2º es el nombre del fichero, de tal manera que con la función strchr busque la primera coincidencia en el fichero de texto con ese char. Después de eso, imprimir todas las líneas restantes. Yo he escrito lo siguiente:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LEN 100

int main(int argc, char *argv[]){
	/* Variable auxiliar */
	int i = 0;

/* Cargamos el caracter que es el segundo argumento en un char */
// char c = &argv[1];
char c = 'h';
char cad[MAX_LEN];

/* Abrimos el fichero y lo abrimos en modo lectura */
FILE *f =  NULL;
f = fopen(argv[2], "r");

/* Para evitar posibles crashes */
if(argc<3){
	printf("ERROR: No hay suficientes argumentos");
	exit(1);
}
if(f==NULL) {
	printf("ERROR: No se puede abrir el archivo.\n");
	exit(1);
}

fgets(cad, MAX_LEN, f);
while(strchr(cad, c)==NULL){
	fgets(cad, MAX_LEN, f);
	i++;
}

printf("Numero de linea donde aparece la primera coincidencia con strchr: %d\n\n", i);
printf("STRCHR: %s\n", strchr(cad, c));

while(fgets(cad, MAX_LEN, f)!=NULL){
	printf("%s\n", cad);
	fgets(cad, MAX_LEN, f);
	cad[0] = '\0';
}

return 0;
}

Tengo 2 problemas. El primero, la asignación de argv[1] al char c (está comentado más arriba en el código) y la función fgets no me coje todas las líneas que debería. Me explico, mi fichero 'info.txt' es así:

olahola
ola
ola
ola
ola

... y el char con el que trabajo es h. Me debería imprimir parte del primer string y después todas las demás, pero sólo me imprime 2 veces 'ola'. Alguien me puede echar una mano?

Saludos y gracias por adelantado.

NeB1

supongo que una vez encuentras la linea deberías gastar

while(!feof(f)){
fgets(cad, max_length,f);
print("%c", cad);
}

nu?

JuAn4k4

h = argv[1];

& es la direccion de argv[1] , osea (argv+1)

NeB1

#3 creo que es *argv[1] porque argv es un array con punteros a cada elemento del array, pero tampoco estoy muy seguro...

zildjian

Investigando, descubrí que era:
char c = argv[1][0];

Y en cuanto al loop, gracias #2! Era justo lo que necesitaba ^^ Y así ya en modo quisquilloso... por qué la última palabra me la imprime 2 veces?

NeB1

jejeje, en este caso te va a funcionar, pero habitualmente no lo hagas así. estás cogiendo la primera letra del parametro 1 de argv, no el parametro en sí, solo que en este caso es una letra así q no hay problema.

es lo de *argv[1] para el resto.

#5 la última palabra o la última linea?
fflush(stdin)? nuse... pega el código a ver...

JuAn4k4

Ajam tiene razon NeBi , yo pensaba que serian cadenas ya que argv es lo que guarda.

Usuarios habituales

  • JuAn4k4
  • NeB1
  • zildjian