C - читает последний конец символа новой строки - PullRequest
0 голосов
/ 19 февраля 2012

Я пытаюсь написать небольшой фрагмент кода, который поочередно объединяет строки из двух файлов и записывает результаты в другой файл, указанный пользователем.

За исключением того, что в данный момент он игнорирует символ '\ 0' и копирует весь файл за раз, а не строку за раз.

#include <stdio.h>
#include <stdbool.h>

int main (void)
{

    char in1Name[64], in2Name[64], outName[64];
    FILE *in1, *in2, *out;

    printf("Enter the name of the first file to be copied: ");
    scanf("%63s", in1Name);

    printf("Enter the name of the second file to be copied: ");
    scanf("%63s", in2Name);

    printf("Enter the name of the output file: ");
    scanf("%63s", outName);


    // Open all files for reading or writing
    if ( (in1 = fopen(in1Name, "r")) == NULL )  
    {
        printf("Error reading %s", in1Name);
        return 1;
    }

    if ( (in2 = fopen(in2Name, "r")) == NULL )
    {
        printf("Error reading %s", in2Name);
        return 2;
    }

    if ( (out = fopen(outName, "w")) == NULL )
    {
        printf("Error writing to %s", outName);
        return 3;
    }


    // Copy alternative lines to outFile
    bool notFinished1 = true, notFinished2 = true;
    int c1, c2;
    while ( (notFinished1) || (notFinished2) ) 
    {

        while ( ((c1 = getc(in1)) != '\0') && (notFinished1) )
        {
            if (c1 == EOF)
            {
                notFinished1 = false;
            }
            else
            {
                putc(c1, out);
            }
        }

        while ( ((c2 = getc(in2)) != '\0') && (notFinished2) )
        {
            if (c2 == EOF)
            {
                notFinished2 = false;
            }
            else
            {
                putc(c2, out);
            }
        }

    } 


    // Close files and finish
    fclose(in1);
    fclose(in2);
    fclose(out);

    printf("Successfully copied to %s.\n", outName);

    return 0;

}

Ответы [ 3 ]

4 голосов
/ 19 февраля 2012

Символ новой строки '\n', а не '\0'.Последний является нулевым (нулевым) байтом;внутри C он используется для обозначения конца строки, но текстовые файлы не содержат его.

1 голос
/ 19 февраля 2012

Если это текстовые файлы, обычно не должно быть \0 после каждой строки - это почти исключительно для строк в памяти. \n - это символ новой строки и, скорее всего, тот символ, который вы хотите проверить.

0 голосов
/ 19 февраля 2012

Я просмотрел ваш код и обнаружил ошибку. Чтобы копировать файлы построчно, вы должны искать «\ n» вместо «\ 0». '\ 0' только завершает строку, но не обозначает новую строку. Замена обоих экземпляров '\ 0' на '\ n' решит вашу проблему.

...