UTNianos

Versión completa: [SSL] Consulta: Leer archivo
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenos dias. Recien vengo del parcial y hubo un ejercicio de C que me pareció "raro". Se los comento

Cita:Ingresan por parametro 2 nombres de archivos. El primero es de entrada y el segundo es de salida.
Leer linea por linea el primer archivo
Si la linea es menor a 80 escribirla en archivo2.
Sino escribir "$$$\n" en el archivo 2.

Okey, lo haria con un fgets pero tengo la premisa de no saber el "tamaño maximo posible" de una linea

Cita:char *fgets (char *string, int n, FILE *stream);
The fgets() function reads characters from the current stream position up to and including the first new-line character (\n), up to the end of the stream, or until the number of characters read is equal to n-1, whichever comes first.
Se me ocurre que podes definir un array de chars de tamaño 80 como si fuese un buffer. Vas leyendo char por char y lo vas guardando en el array. Por cada caracter leido vas contando la cantidad de char en la linea (y lo podes usar como posicion). Si en algun momento se te llena el buffer, descartas e imprimis "$$$\n". Si encontras un '\n', ya tenes todo guardado en el buffer. El ciclo termina con un EOF.

Otra forma es usando el fgets y el strlen. Pero ahi estarias usando la libreria de strings, y la verdad que para un ejercicio tan boludo, no rinde. Por mas que sea muy simple de esta forma, la idea es demostrar que sabes C.
Recien se me ocurrio algo: Al ser la variable int n, su maximo valor de int, es el maximo tamaño de la linea leida. Por ende:

while(fgets(linea, 2^sizeof(int), in)!=NULL)
{
while(linea[i]!='\n')
i++;
if(i<80)
fputs(linea, out);
else
fputs("$$$\n", out);
}

Cualquier cosa corriganme... se que el operador potencia no existe en ANSI C xD Podria hardcodear el valor y listo.
De la función fgets, y sus parámetros
char * fgets ( char * str, int num, FILE * stream );

Lee hasta (num-1), pero lo que te resuelve todo es saber que lee hasta que se encuentra con una nueva línea, por lo que se te facilita el tema del tamaño máximo de la línea, guardás eso en un string, lees el largo y ya está.

Saludos
Claro, eso lo entiendo pero

fgets(linea, num, in)

Con que valor num llamarias la funcion? Yo con 2^32 porque desconosco el tamaño maximo de la cadena (debe funcionar para cualquier archivo de texto).
Podés usar sizeof (linea) como 2º parámetro.
¡Aloha!

man fgets escribió:#include <stdio.h>

char *fgets(char *s, int size, FILE *stream);

fgets() reads in at most one less than size characters from stream and
stores them into the buffer pointed to by s. Reading stops after an
EOF or a newline. If a newline is read, it is stored into the buffer.
A terminating null byte ('\0') is stored after the last character in
the buffer.

gets() and fgets() return s on success, and NULL on error or when end
of file occurs while no characters have been read.

Osea, siempre te devuelve un string (una cadena terminada en '\0'), y opcionalmente incluye el \n (sólo cuando entra en el tamaño que le pasaste).
Yo declararía el buffer de 81 bytes, y usaría strlen() para obtener el último caracter "útil" del string (hacer directamente buffer[80] sería leer basura para líneas menores a 80 bytes). strlen() cuenta cuántos caracteres hay hasta el primer '\0'. Si el caracter buffer[strlen(buffer)] es distinto de '\n', entonces la línea está incompleta: escribís "$$$\n" en el archivo y hacés un par de fgets() más para leer por completo esa línea, ignorando lo que leés (un while con la comparación esta de buffer[strlen(buffer)] != '\n'). Y ahí volvés a procesar la línea nueva.
URLs de referencia