es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo copiar algunas cadenas de un archivo a otro usando programación en C?

Tengo este código:

#include <stdio.h>
#include <stdlib.h>

int main()
{

FILE *ptr = fopen("data.txt","r");
char filename[100];
if (ptr==NULL)
{
    printf("no existe el archivo.");
    return 0;
}

char buf[100];
while (fscanf(ptr,"%*s %*s %s ",buf)==1) {
  if(buf[strlen(buf)-1] == '5') {
    printf("%s\n", buf);
    FILE *fptr2;


    printf("Crea un archivo \n");
    scanf("%s", filename);
    fptr2 = fopen(filename, "w");
    if (fptr2 == NULL)
    {
        printf("No se puede abrir el archivo %s \n", filename);
        exit(0);
    }

    FILE *fptr1 = fopen("data.txt", "r");
    if (fptr1 == NULL)
    {
        printf("No se puede abrir el archivo %s \n", filename);
        exit(0);
    }

    int c = fgetc(fptr1);
    while (c != EOF)
    {
        if(c == '\n'){
          fprintf(fptr2, "\n");
          c = fgetc(fptr1);
          continue;
        }
        char r[100];
        fscanf(fptr1, "%s", r);
        if(r[strlen(r)-1] == '5'){
          fprintf(fptr2, "%s ", r);
        }
      c = fgetc(fptr1);
    }

    printf("\nContenido copiado a %s", filename);

    fclose(fptr1);
    fclose(fptr2);
    return 0;
}

}

Copia todo el contenido desde un archivo a otro. Necesito copiar sólo las cadenas que tienen el número 5 como último caracter (en la tercera columna).

Por ejemplo, el archivo Data.txt se ve así:

Alek 10B 4
Juan 10A 3
Kate 10C 5

En el archivo que crearé durante la ejecución solo debe copiarse la cadena Kate 10C 5. He estado intentando durante horas pero no sé cómo hacerlo. ¿Me puedes ayudar?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para copiar solo las cadenas que tienen un 5 como último carácter (en la tercera columna), puede modificar el bucle while que lee del archivo de la siguiente manera:

    char buf[100];
    while (fscanf(ptr,"%*s %*s %s ",buf)==1)
    {
        if (buf[strlen(buf)-1] == '5') // Comprueba si el último carácter es un '5'
            fprintf(fptr2, "%s\n", buf); // Escribe la cadena en el archivo de salida
    }
    

    Aquí, buf contiene la cadena leída del archivo. Comprobamos si el último carácter en la cadena es '5' (el carácter '5' entre comillas simples representa el valor ASCII del dígito 5). Si el último carácter es efectivamente '5', escribimos la cadena en el archivo de salida utilizando la función fprintf.

    Tenga en cuenta que he reemplazado fputc por fprintf en este fragmento de código, porque necesitamos escribir una cadena (no un solo carácter) en el archivo de salida.

    En general, su código modificado para copiar solo las cadenas con ‘5’ como último carácter podría verse así:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
        FILE* ptr = fopen("data.txt","r");
        char filename[100];
        if (ptr == NULL)
        {
            printf("no existe el archivo.");
            return 0;
        }
    
        printf("Crear archivo: ");
        scanf("%s", filename);
    
        // Abre el archivo de salida en modo escritura
        FILE* fptr2 = fopen(filename, "w");
        if (fptr2 == NULL)
        {
            printf("No se puede abrir el archivo %s\n", filename);
            exit(0);
        }
    
        char buf[100];
        while (fscanf(ptr, "%*s %*s %s ", buf) == 1)
        {
            if (buf[strlen(buf)-1] == '5') // Comprueba si el último carácter es un '5'
                fprintf(fptr2, "%s\n", buf); // Escribe la cadena en el archivo de salida
        }
    
        printf("Contenido copiado en %s\n", filename);
    
        fclose(ptr);
        fclose(fptr2);
        return 0;
    }
    

    Tenga en cuenta que este código no se ha probado, por lo que es posible que necesite realizar algunas modificaciones menores dependiendo de los requisitos exactos o el entorno específico en el que lo esté ejecutando.</string.h></stdlib.h></stdio.h>

Comments are closed.