Seguimos buscando a Arshak. Ayudanos compartiendo!
Encuesta no oficial de docentes
Resultados de la encuesta no oficial de docentes
Probaste el SIGA Helper?

Donar $100 Donar $200 Donar $500 Donar mensualmente


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
[SSL] Consulta: Leer archivo
Autor Mensaje
Nikod11 Sin conexión
Secretario General
Sin estado :(
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 791
Agradecimientos dados: 85
Agradecimientos: 473 en 57 posts
Registro en: Mar 2011
Mensaje: #1
[SSL] Consulta: Leer archivo Parciales Sintaxis y Semántica de los Lenguajes
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.
(Este mensaje fue modificado por última vez en: 03-07-2013 22:01 por Nikod11.)
03-07-2013 22:00
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Maxy Sin conexión
Empleado del buffet
Sin estado :(
*

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 9
Agradecimientos dados: 1
Agradecimientos: 2 en 2 posts
Registro en: Sep 2011
Mensaje: #2
RE: [SSL] Consulta: Leer archivo
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.
03-07-2013 22:11
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
Sin estado :(
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 791
Agradecimientos dados: 85
Agradecimientos: 473 en 57 posts
Registro en: Mar 2011
Mensaje: #3
RE: [SSL] Consulta: Leer archivo
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.
(Este mensaje fue modificado por última vez en: 03-07-2013 22:32 por Nikod11.)
03-07-2013 22:30
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gustavo_hekel Sin conexión
Empleado del buffet
Live Forever
*

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 10
Agradecimientos dados: 11
Agradecimientos: 0 en 0 posts
Registro en: Oct 2012
Mensaje: #4
RE: [SSL] Consulta: Leer archivo
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
03-07-2013 22:46
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
Sin estado :(
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 791
Agradecimientos dados: 85
Agradecimientos: 473 en 57 posts
Registro en: Mar 2011
Mensaje: #5
RE: [SSL] Consulta: Leer archivo
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).
03-07-2013 22:53
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gustavo_hekel Sin conexión
Empleado del buffet
Live Forever
*

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 10
Agradecimientos dados: 11
Agradecimientos: 0 en 0 posts
Registro en: Oct 2012
Mensaje: #6
RE: [SSL] Consulta: Leer archivo
Podés usar sizeof (linea) como 2º parámetro.
04-07-2013 01:15
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Desert69 Sin conexión
Presidente del CEIT
Sin estado :( / "Anarquia...
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 2.477
Agradecimientos dados: 230
Agradecimientos: 345 en 206 posts
Registro en: Jun 2008
Mensaje: #7
RE: [SSL] Consulta: Leer archivo
¡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.

[Imagen: a2.php]
[Imagen: 971aa6599664453c05cb3e42d58bbc0eo.jpg]
04-07-2013 13:55
Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)