int main()
{
   FILE *infile;
   FILE *infile2;
   char input[255],input2[255];
   int status1, status2;

   infile = fopen("test.txt", "r");
   infile2 = fopen("test2.txt", "r");
   if(infile == NULL)
   {
      printf("Can not open file 1!\n");
   }
   else if(infile2 == NULL)
   {
      printf("Can not open file 2!\n");
   }
   else
   {
      do
      {
        status1 = fscanf(infile, "%s", &input);
        status2 = fscanf(infile2, "%s", &input2);

        printf("File 1: %s\n File 2: %s\n", input, input2);
     }while(status1 != -1 || status2 != -1);
   }
   fclose(infile);
   fclose(infile2);

   return 0;
}

Mi salida se parece a esto:

Salida

Me gustaría imprimir el archivo 1 en una línea no palabra por palabra. Lo mismo va para el archivo2. Yo soy un poco nuevo en C así que estoy atascado.

Esto no es C#. Por favor, lea el post y aviso que del lenguaje de referencia…
Uso while (fgets(input, sizeof input, infile)) {...}
Su código es muy propenso a errores. ¿Qué sucede si el primer archivo es más corto/más que el segundo archivo? Utilice scanf de todos modos, ya que ir dentro de la while bucle si sea status1 o status2 no son -1.

OriginalEl autor Knut André Syversen | 2016-02-04

4 Comentarios

  1. 4

    Si quieres leer toda la línea, utilice fgets función en lugar de fscanf:

    char *status1, *status2;
       .
       .
       .
    do {
        status1 = fgets(input, sizeof(input), infile);
        status2 = fgets(input2, sizeof(input2), infile2);
        printf("File 1: %s File 2: %s", input, input2);
    } while (status1 || status2);

    Nota cómo printf ya no utiliza \n. Esto es debido a que fgets mantiene \n desde el archivo dentro de su cadena de entrada.

    Tenga en cuenta que status1 y status2 ahora char * y no int variables. También sería buena idea para comprobar los valores de status y status2 antes de llamar a printf() Si devuelve NULL, printf() mostrará los resultados de la anterior iteración del bucle para el correspondiente archivo de entrada. Y ¿qué pasa si una línea es más de sizeof(input)?
    Usted también no necesita el !=Verificación NULL. Expresiones booleanas no son ciudadanos de primera clase en C. por Lo tanto Null significa falso en C.
    Gracias por la captura de ese. Me perdí el NULL de verificación de la primera edición.
    Yo estaba pensando en la edición, pero luego pensé que tal vez el escritor y editor posible que no desee, ya que no siempre se conoce que null significa falso y !null es cierto para algunas personas, y sería una simple respuesta para algunos lectores futuros, incluyendo a la persona que escribió la pregunta que (por su propia declaración) es un novato en C 🙂

    OriginalEl autor dasblinkenlight

  2. 2

    He hecho los cambios en el código y funciona, pero otra pregunta. Si yo quería comparar los archivos y escriba la diferencia a un nuevo archivo como este:

    1. Archivo1: Mi nombre es Knut
    2. Archivo2: Mi nombre es KnutAndre
    3. Archivo3: Andre (Esta es la diferencia entre los archivos).

    Mi profesor me dijo que usar strcmp y, a continuación, obtener la salida en un archivo nuevo, pero yo no entiendo muy bien de él.. ¿alguien tiene algunos consejos que pude probar?

    Esta es la forma en que mi código de mirar tan lejos:

    int main()
    {
    
    FILE *infile;
    FILE *infile2;
    FILE *outfile3;
    char input[255],input2[255];
    char status1, status2;
    
    
    
    infile = fopen("test.txt", "r");
    infile2 = fopen("test2.txt", "r");
    
    if(infile == NULL)
    {
        printf("Can not open file 1!\n");
    }
    else if(infile2 == NULL)
    {
        printf("Can not open file 2!\n");
    }
    else
    {
        do
        {
            status1 = fgets(input, sizeof(input), infile);
            status2 = fgets(input2, sizeof(input2), infile2);
    
            if(status1 != 0){
    
            printf("File 1: %s\n\nFile 2: %s\n\n", input, input2);
    
            int result = strcmp(input, input2);
            printf("\nResult = %d\n\n", result);
    
            }
    
    
        }
        while(status1 || status2);
    
    }
    fclose(infile);
    fclose(infile2);
    
    return 0;
    
    
    
    }
    Una cuestión diferente es abrir una diferente a la pregunta de mi amigo. Este no es un foro. Esta es una P&Un sitio. Pides algo con sentido, que la gente responda, si usted tiene otra pregunta, pregunte de nuevo. A menos que tu pregunta es de mala calidad, etc

    OriginalEl autor Knut André Syversen

  3. 1

    Cuando se utiliza el fscanf sólo leer los caracteres hasta que el no carácter de espacio en blanco se produce. Cuando usted necesita para obtener la entrada como toda la línea, a continuación, usted tiene que utilizar fgets().

    De la man página de fgets().

    fgets() lee en la mayoría de los uno menos que el tamaño de los caracteres de la secuencia y los almacena en el buffer apuntado por s. La lectura se detiene después de un
    EF o un salto de línea. Si un salto de línea se lee, se almacena en el búfer. Un byte nulo de terminación (‘\0’) se almacenan después del último carácter
    en el búfer.

    Por lo que se utilizará como este.

      fgets(input,255,infile);
      fgets(input2,255,infile2);

    Mientras que la comprobación de la condición,

    while(input != NULL || input2 != NULL);

    OriginalEl autor Karthikeyan.R.S

Dejar respuesta

Please enter your comment!
Please enter your name here