2012-02-19 128 views
-2

我正在尝试编写一小段代码,用于从两个文件中交替合并行,并将结果写入另一个文件,所有文件都由用户指定。C - 读取换行符的结尾

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

} 

回答

4

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

+0

我觉得自己像一个白痴,为什么我不试试这个...... 我有点困惑,我一直在使用'\ 0'来检测以前的行结束。 我想我一直在研究C太久,现在我要去海滩休息一下。 – gbhall 2012-02-19 04:28:05

+0

@gbhall:Re:“我一直在使用'\ 0'来检测一行以前的结尾”:好吧,如果你一直在用'fgets'或'getline'来读取整行一次,那么字符串中的最后一个字符将是“\ n”,之后将是一个“\ 0”来表示字符串已经结束;所以使用''\ 0''来检测行结束会或多或少的工作,因为C字符串的工作方式。但是如果你一直这样使用'getc',那么 - 不。 – ruakh 2012-02-19 14:28:46

1

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

0

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