/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Escritura de archivos

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
turusand



Registrado: 21 Ene 2008
Mensajes: 6

MensajePublicado: 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

MensajePublicado: 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

    MensajePublicado: 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

    MensajePublicado: 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

    MensajePublicado: 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
          Índice del Foro elrincondelc.com -> C/C++ en General
    Página 1 de 1Todas las horas están en GMT - 8 Horas

     
    No puede crear mensajes
    No puede responder temas
    No puede editar sus mensajes
    No puede borrar sus mensajes
    No puede votar en encuestas

    (c) ElRincondelC.com

    Un proyecto de UrlanHeat.com