2012-02-19 129 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'的兩個實例將解決您的問題。