| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
turusand
Registrado: 21 Ene 2008 Mensajes: 6
| Publicado: 20/02/2008 2:35 am | | | Título: Escritura de archivos |
| Hola, estoy tratando de escribir un archivo de texto a partir de uno de C ya existente. El problema es que lo leo corretamente, porque me sale en pantalla todo el programa escrito en c, pero a este le quiero quitar los comentarios del archivo fiuente sean del tipo (/* */, o //). Pero en el tema de la escritura de nuevo al archivo de texto no me acaba de salir bien. #include <stdio.h> #include <stdlib.h>
int main(){ FILE *f; char car; int sw=0;
//proceso de lectura
system("cls");
printf("Lectura del archvo\n");
if((f=fopen("m8p1.cpp","r"))==NULL){ printf("Error al intentar abrir el archivo\n"); return; }
while((car=getc(f))!=EOF) putchar(car); putchar('\n'); fclose(f);
return ;
//proceso de escritura
system("clear"); if((f=fopen("arxiu.txt","w"))==NULL){ printf("Error al intentar abrir el archivo\n"); return; }
while((car=getc(f))!=EOF) { if(getc(f)=='/') sw=sw+1; else sw=0; if ((sw==2)&&(getc(f))=='\n') sw=0; if (sw==0) putc(car,f); putchar('\n'); fclose(f);
return ; } }
Agradeceria que alguien me eche un cable. |
| | Volver arriba | |  | mamntc02
Registrado: 30 Abr 2007 Mensajes: 399
| Publicado: 20/02/2008 4:36 am | | | Título: |
| Hola:
Tienes varios errores en el código, y me cuesta creer q te compile. Qué compilador usas? Bajo qué plataforma?
- return debe indicar el valor de retorno, ya q main devuelve int.
- Tienes un 'return;' en medio del código q no tiene ningún sentido, ya q haría q jamás se ejecute el proceso de escritura en fichero.
- Si estás en Windows system("clear"); no tiene sentido, y si estás en linux system("cls"); tampoco.
- Cuando has acabado de leer el fichero, el puntero q accede a la siguiente posición a leer, está al final del fichero, por tanto siempre te devolverá q estás a final de fichero y no hará nada. Debes mover la posición del puntero al principio del fichero. Una manera es cerrar y volver a abrir el fichero. La otra, y más usual, es usar fseek():
| Código: | fseek(fp, 0, SEEK_SET); |
Estás usando el mismo manejador de fichero, f, para leer q para escribir. Por lo q la sentencia:| Código: | while((car=getc(f))!=EOF) | No tiene sentido, ya q el fichero está vacio, pq lo acabas de crear como escritura. Saludos. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 4356 Ubicación: Mexico
| Publicado: 20/02/2008 8:04 am | | | Título: |
| Lo primero que debes aclarar es el lenguaje de programacion que estas utilizando ya que si bien indicas que este es C el archivo que abres ("m8p1.cpp") tiene la extension "cpp" (c ==> lenguaje C, cpp|cxx|etc ==> C++).
Aparte de lo ya comentado el proceso en general consiste en manejar tres estados: texto "normal", comentarios de una sola linea y comentarios de formato libre (o "multilinea").
Esto lo implementas en base a una maquina de estado sencilla donde una variable indica el tipo de texto (las tres opciones antes mencionadas) y en base a ese estado y el caracter leido te mueves de un estado a otro hasta alcanzar el estado final (indicado por el fin de archivo).
Podrias empezar corrigiendo el programa para que este procese el archivo caracter por caracter, el siguiente paso seria agregar los demas estados para reconocer los comentarios.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | turusand
Registrado: 21 Ene 2008 Mensajes: 6
| Publicado: 23/02/2008 9:18 am | | | Título: Gracias por la respuesta |
| | mamntc02 escribió: | Hola: Tienes varios errores en el código, y me cuesta creer q te compile. Qué compilador usas? Bajo qué plataforma?
- return debe indicar el valor de retorno, ya q main devuelve int.
- Tienes un 'return;' en medio del código q no tiene ningún sentido, ya q haría q jamás se ejecute el proceso de escritura en fichero.
- Si estás en Windows system("clear"); no tiene sentido, y si estás en linux system("cls"); tampoco.
- Cuando has acabado de leer el fichero, el puntero q accede a la siguiente posición a leer, está al final del fichero, por tanto siempre te devolverá q estás a final de fichero y no hará nada. Debes mover la posición del puntero al principio del fichero. Una manera es cerrar y volver a abrir el fichero. La otra, y más usual, es usar fseek():
| Código: | fseek(fp, 0, SEEK_SET); |
- Estás usando el mismo manejador de fichero, f, para leer q para escribir. Por lo q la sentencia:
| Código: | while((car=getc(f))!=EOF) | No tiene sentido, ya q el fichero está vacio, pq lo acabas de crear como escritura.
|
Gracias por la respuesta pero sigue sin funcionarme correctamente. No se a que se debe, porque he hecho los cambios que tu decias. Uso el Microsoft Visual Studio 6.0 Saludos, Artur |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 4356 Ubicación: Mexico
| Publicado: 24/02/2008 3:26 am | | | Título: |
| Trata de ser lo mas claro posible porque si no es asi aun cuando sea nuestra intencion ayudarte eso no va a ser posible.
Mencionas que realizaste ciertos cambios y el programa aun no funciona, para poder ayudarte debes publicar el codigo fuente e indicar cual es exactamente el problema (mensaje de error del compilador, error en tiempo de ejecucion, resultados inexactos, etc.).
Si no es asi todo queda en conjeturas.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |