Modificar un archivo de texto

Iniciado por erest0r, 27 Febrero 2014, 22:38 PM

0 Miembros y 1 Visitante están viendo este tema.

erest0r

Hola, este es mi codigo

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <string.h>

int main( int argc, char* args[] )
{
    FILE *ptr;
    fpos_t pos;
    char palabra_usuario[50] = {};
    char palabra_archivo[50] = {};
    char ch;
    int n = 0;
    bool encontrado = false;

    ptr = fopen("prueba.txt", "r+");

    if( ptr )
    {
        printf("Escriba lo que desea modificar: ");
        fgets(palabra_usuario, 50, stdin);

        while( !feof(ptr) || !encontrado )
        {
            fgetpos( ptr, &pos );

            do
            {
                ch = fgetc(ptr);
                palabra_archivo[n++] = ch;
            }while( ch != '\n' );

            palabra_archivo[n] = '\0';
            n = 0;

            if( strcmp(palabra_usuario, palabra_archivo) == 0 )
            {
                printf("Su palabra: %s Palabra encontrada: %s\n\n", palabra_usuario, palabra_archivo);
                printf("Escriba por lo que lo quiera cambiar: ");
                fgets(palabra_usuario, 50, stdin);
                fsetpos(ptr,&pos);
                fprintf(ptr, "%s", palabra_usuario);
                encontrado = true;
            }
        }

        if( !encontrado )
            printf("No se encontro esa palabra");
    }

    fclose(ptr);

    return 0;
}



El programa encuentra efectivamente la palabra del archivo de texto (Nota: el archivo de texto ya existe), pero cuando intento agregar la nueva palabra para modificarla el programa muestra un error.

Gracias por la ayuda de antemano.
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

erest0r

#1
/
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

ivancea96

No das datos de cómo está estructurado el archivo, ni sobre el error. Tampoco dices si has detectado en donde está el error.

Si el archivo es pequeño, lo que hago yo es leerlo entero, y reescribirlo con la palabra cambiada.

erest0r

ejemplo del archivo:

pedro
jose
luis

Cuando trato de buscar alguno de las palabras menos la ultima, el programa las encuentra, pero cuando ingreso la nueva palabra para cambiarla el programa se sale, y cuando introduzco la ultima palabra o la palabra no existe tambien se sale.

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

erest0r

Bueno logre que al menos cumpla su cometido.

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <string.h>

int main( int argc, char* args[] )
{
    FILE *ptr;
    fpos_t pos;
    char palabra_usuario[50] = {};
    char palabra_a_buscar[50] = {};
    char archivo_restante[256] = {};    // Almacena la cadena de caracteres restante en caso haya encontrado la palabra deseada
    char ch;
    int n;
    bool encontrado = false;

    ptr = fopen("prueba.txt", "r+");

    if( ptr )
    {
        printf("Escriba lo que desea modificar: ");
        fgets(palabra_usuario, 50, stdin);

        while( !feof(ptr) && !encontrado )
        {
            n = 0;
            fgetpos( ptr, &pos );

            do
            {
                ch = fgetc(ptr);
                palabra_a_buscar[n++] = ch;

            } while( ch != '\n' && ch != EOF );

            if( palabra_a_buscar[n-1] == EOF )
                palabra_a_buscar[n-1] = '\n';

            if( strcmp(palabra_usuario, palabra_a_buscar) == 0 )
            {
                n = 0;
                do
                {
                    ch = fgetc(ptr);
                    archivo_restante[n++] = ch;
                } while( !feof(ptr) && ch != EOF );
                archivo_restante[n-1] = '\0';

                printf("Su palabra: %s \nPalabra encontrada: %s\n\n", palabra_usuario, palabra_a_buscar);
                printf("Escriba por lo que lo quiera cambiar: ");
                fgets(palabra_usuario, 50, stdin);
                fsetpos(ptr,&pos);
                fprintf(ptr, "%s%s", palabra_usuario, archivo_restante);
                encontrado = true;
            }
            memset(palabra_a_buscar, '\0', 50);
        }

        if( !encontrado )
            printf("No se encontro esa palabra");
    }

    fclose(ptr);
   
    return 0;
}


Quizas exista una manera mas eficiente, pero al menos pude hacer que funcionara
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.