Autor
|
Tema: [C] - Problemas con archivos - SOLUCIONADO (Leído 3,899 veces)
|
cbug
Desconectado
Mensajes: 147
|
Hola, resulta que estaba practicando algo con archivos, y se me ocurrió hacer 2 procedimientos para leer línea a línea y char a char... En fin, este es el code: #include <stdio.h> #include <stdlib.h> #include <string.h> void Lee_Caracter(char *RUTA); void Lee_Lineas(char *RUTA); void Menu(void); char *itoa(int val , int base ); void Limpiar_Buffer(void) { } int main() { int opt; char *ruta_local = "texto.txt"; Menu(); Limpiar_Buffer(); while(opt != 0) { switch(opt) { case 1: { Lee_Caracter(ruta_local); break; } case 2: { Lee_Lineas(ruta_local); break; } default: break; } Menu(); Limpiar_Buffer(); } return 0; } char* itoa(int val , int base ){ static char buf[32] = {0}; int i = 30; for(; val && i ; --i, val /= base) buf[i] = "0123456789abcdef"[val % base]; return &buf[i+1]; } void Menu(void) { puts("\t**** MENU ****\t"); puts("1- Leer caracter a caracter"); puts("2- Leer linea a linea"); } void Lee_Caracter(char *RUTA) { FILE *fp; char buffer; if(!fp) puts("Error al intentar abrir archivo"); else while((buffer = getc(fp )) != EOF ) } void Lee_Lineas(char *RUTA) { FILE *fp; char *buffer; char *mi_eof = NULL; if(!fp) puts("Error al intentar abrir archivo"); else { buffer = (char *)(malloc(sizeof(char) * 100)); fgets(buffer , sizeof(char) * 100, fp ); while(strstr(buffer , mi_eof ) != NULL ); { buffer = (char *)(malloc(sizeof(char) * 100)); fgets(buffer , sizeof(char) * 100, fp ); } } }
El problema está en mi función atoi, al compilar: lectura.c: In function 'Lee_Lineas': lectura.c:89: warning: passing argument 1 of 'atoi' makes pointer from integer without a cast lectura.c:89: error: too many arguments to function 'atoi' lectura.c:89: warning: assignment makes pointer from integer without a cast
No puedo resolverlo. Ahora bien, tengo una duda más, está bien la forma en que busco el EOF del archivo, en la función Lee_Lineas()? EDITADO: La primera duda resuelta, estaba dormido y cambié itoa por atoi Ahora el problema es que la función Lee_Lineas no funciona CORREGIDO: while(strstr(buffer, mi_eof) == NULL) Creo que el problema está en que no incremento el puntero para leer el archivo.
|
|
« Última modificación: 11 Julio 2010, 00:19 am por cbug »
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
int atoi ( const char * str ); No concuerda con tu llamada, estás enviando EOF una macro o un indicador. Sin contar que la función solo trabaja con un argumento. malloc() no necesita un casting. Y para cada clausula dentro del switch(), no son necesarias las llaves case ALGO: /* codigo */ break; Saludos.
|
|
« Última modificación: 11 Julio 2010, 00:09 am por Leo Gutiérrez. »
|
En línea
|
|
|
|
cbug
Desconectado
Mensajes: 147
|
void Lee_Lineas(char *RUTA) { FILE *fp; char *buffer; char *mi_eof = NULL; if(!fp) puts("Error al intentar abrir archivo"); else { buffer = malloc(sizeof(char) * 100); fgets(buffer , sizeof(char) * 100, fp ); while(strstr(buffer , mi_eof ) == NULL ); { buffer = malloc(sizeof(char) * 100); fgets(buffer , sizeof(char) * 100, fp ); } } }
Aqui tengo el problema en que sólo lee la primera línea y sale. SOLCUCIONADO:
No se necesita comparar, o buscar el EOF, leyendo el man de fgets:
Upon successful completion, fgets() and gets() return a pointer to the string. If end-of-file occurs before any characters are read, they return NULL and the buffer contents remain unchanged. If an error occurs, they return NULL and the buffer contents are indeterminate. The fgets() and gets() functions do not distinguish between end-of-file and error, and callers must use feof(3) and ferror(3) to determine which occurred. [/b] void Lee_Lineas(char *RUTA) { FILE *fp; char *buffer; if(!fp) puts("Error al intentar abrir archivo"); else { buffer = malloc(sizeof(char) * 100); while(fgets(buffer , sizeof(char) * 100, fp )); { buffer = malloc(sizeof(char) * 100); } } }
|
|
« Última modificación: 11 Julio 2010, 00:18 am por cbug »
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
Es que no entiendo por qué usar itoa() y strstr() si tu objetivo solo es leer el archivo línea línea. Yo hice algo así y funciona: void Lee_Lineas(char *ruta) { FILE *archivo = fopen(ruta , "r"); if(archivo == NULL) { perror("Problema abriendo archivo."); } else { char linea[500]; while(fgets(linea , 500, archivo ) != NULL ) } }
|
|
« Última modificación: 11 Julio 2010, 02:05 am por Leo Gutiérrez. »
|
En línea
|
|
|
|
cbug
Desconectado
Mensajes: 147
|
Cierto, justo había leído el man. Solucionado
|
|
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
No utilices un array dinámico, puesto que el valor por defecto es 100, así que puedes crearlo directamente: Así te evitas el uso de malloc(), free() y la inclusión de stdlib.h. saludos.
|
|
|
En línea
|
|
|
|
cbug
Desconectado
Mensajes: 147
|
Es que ahora pienso modificarlo, puesto que como dijiste, sólo lee 100 caracteres, y muchas veces el .txt posee más en una sóla línea, y necesitaré prontamente un realloc()
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[solucionado]problemas con mid vb.net
.NET (C#, VB.NET, ASP)
|
CH4ØZ
|
3
|
4,866
|
1 Febrero 2011, 01:43 am
por CH4ØZ
|
|
|
PROBLEMAS CON FAIL2BAN!!!! <solucionado>
GNU/Linux
|
xarlyuno
|
1
|
3,561
|
19 Agosto 2011, 12:07 pm
por xarlyuno
|
|
|
(SOLUCIONADO) Problemas con DIV
PHP
|
dimitrix
|
0
|
1,738
|
5 Abril 2012, 16:57 pm
por dimitrix
|
|
|
(Solucionado) Importar archivos .PSP de PS CS 5 a PS CS 6
Diseño Gráfico
|
Eleкtro
|
0
|
5,732
|
30 Mayo 2012, 15:32 pm
por Eleкtro
|
|
|
Duda archivos en C (solucionado)
Programación C/C++
|
David8
|
4
|
3,081
|
19 Mayo 2014, 18:36 pm
por rir3760
|
|