C - 读取换行符的结尾

时间:2012-02-19 04:17:52

标签: c newline fopen

我正在尝试编写一小段代码,这些代码从两个文件中交替合并行,并将结果写入另一个文件,全部由用户指定。

除此之外,它似乎忽略了'\ 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 个答案:

答案 0 :(得分:4)

换行符是'\n',而不是'\0'。后者是零值(空)字节;在C中,它用于表示字符串的结尾,但文本文件不包含它。

答案 1 :(得分:1)

如果这些是文本文件,则每行之后通常不会有\0 - 这几乎完全用于内存中的字符串。 \n是换行符char,很可能是您想要检查的char。

答案 2 :(得分:0)

我已经完成了您的代码,并发现了错误。要逐行复制文件,您应该寻找'\ n'而不是'\ 0'。 '\ 0'只终止字符串,不指定新行。用'\ n'替换'\ 0'的两个实例将解决您的问题。