2014-04-02 26 views
0

有人可以爲我解開這個謎嗎?
我讀到 '/ r' 和 '/ N' 之間的區別,這不是我要問...文件中的回車符

考慮這兩個文件:
的config.txt:

home/my_user/Documents/prog/my_folder 
home/my_user/Documents/prog/IO/input_for_prog.txt 
home/my_user/Documents/prog/IO/correct_output.txt 

的test.txt:

This is a test file 
Why isn't there carriage return char 
at the end of each line in this file? 

現在,考慮下面的代碼:

int main(int argc, char* argv[]) { 

    int fd=open(argv[1], O_RDONLY); 
    if (fd==-1) { 
     perror("Error opening"); 
     return -1; 
    } 

    char ch; 
    int ret_code; 

    while ((ret_code=read(fd, &ch, 1))!=0) { 

     if (ret_code==-1) { 
      perror("Error reading"); 
      return -1; 
     } 

     printf("Character is: %c, its ascii value: %d\n", ch, ch); 
    } 
} 

只是暫時忽略潛在的錯誤,因爲這不是問題在這裏(我希望)。 此代碼將只打印文件中的每個字符,並且它是ascii值。

現在,看的時候我在上述文件中運行它時會發生什麼?
輸出爲的config.txt:

Character is: h, its ascii value: 104 
Character is: o, its ascii value: 111 
Character is: m, its ascii value: 109 
Character is: e, its ascii value: 101 
Character is: /, its ascii value: 47 
Character is: m, its ascii value: 109 
Character is: y, its ascii value: 121 
Character is: _, its ascii value: 95 
Character is: u, its ascii value: 117 
Character is: s, its ascii value: 115 
Character is: e, its ascii value: 101 
Character is: r, its ascii value: 114 
Character is: /, its ascii value: 47 
Character is: D, its ascii value: 68 
Character is: o, its ascii value: 111 
Character is: c, its ascii value: 99 
Character is: u, its ascii value: 117 
Character is: m, its ascii value: 109 
Character is: e, its ascii value: 101 
Character is: n, its ascii value: 110 
Character is: t, its ascii value: 116 
Character is: s, its ascii value: 115 
Character is: /, its ascii value: 47 
Character is: p, its ascii value: 112 
Character is: r, its ascii value: 114 
Character is: o, its ascii value: 111 
Character is: g, its ascii value: 103 
Character is: /, its ascii value: 47 
Character is: m, its ascii value: 109 
Character is: y, its ascii value: 121 
Character is: _, its ascii value: 95 
Character is: f, its ascii value: 102 
Character is: o, its ascii value: 111 
Character is: l, its ascii value: 108 
Character is: d, its ascii value: 100 
Character is: e, its ascii value: 101 
Character is: r, its ascii value: 114 
, its ascii value: 13 
Character is: 
, its ascii value: 10 
Character is: h, its ascii value: 104 
Character is: o, its ascii value: 111 
Character is: m, its ascii value: 109 
Character is: e, its ascii value: 101 
Character is: /, its ascii value: 47 
Character is: m, its ascii value: 109 
Character is: y, its ascii value: 121 
Character is: _, its ascii value: 95 
Character is: u, its ascii value: 117 
Character is: s, its ascii value: 115 
Character is: e, its ascii value: 101 
Character is: r, its ascii value: 114 
Character is: /, its ascii value: 47 
Character is: D, its ascii value: 68 
Character is: o, its ascii value: 111 
Character is: c, its ascii value: 99 
Character is: u, its ascii value: 117 
Character is: m, its ascii value: 109 
Character is: e, its ascii value: 101 
Character is: n, its ascii value: 110 
Character is: t, its ascii value: 116 
Character is: s, its ascii value: 115 
Character is: /, its ascii value: 47 
Character is: p, its ascii value: 112 
Character is: r, its ascii value: 114 
Character is: o, its ascii value: 111 
Character is: g, its ascii value: 103 
Character is: /, its ascii value: 47 
Character is: I, its ascii value: 73 
Character is: O, its ascii value: 79 
Character is: /, its ascii value: 47 
Character is: i, its ascii value: 105 
Character is: n, its ascii value: 110 
Character is: p, its ascii value: 112 
Character is: u, its ascii value: 117 
Character is: t, its ascii value: 116 
Character is: _, its ascii value: 95 
Character is: f, its ascii value: 102 
Character is: o, its ascii value: 111 
Character is: r, its ascii value: 114 
Character is: _, its ascii value: 95 
Character is: p, its ascii value: 112 
Character is: r, its ascii value: 114 
Character is: o, its ascii value: 111 
Character is: g, its ascii value: 103 
Character is: ., its ascii value: 46 
Character is: t, its ascii value: 116 
Character is: x, its ascii value: 120 
Character is: t, its ascii value: 116 
, its ascii value: 13 
Character is: 
, its ascii value: 10 
Character is: h, its ascii value: 104 
Character is: o, its ascii value: 111 
Character is: m, its ascii value: 109 
Character is: e, its ascii value: 101 
Character is: /, its ascii value: 47 
Character is: m, its ascii value: 109 
Character is: y, its ascii value: 121 
Character is: _, its ascii value: 95 
Character is: u, its ascii value: 117 
Character is: s, its ascii value: 115 
Character is: e, its ascii value: 101 
Character is: r, its ascii value: 114 
Character is: /, its ascii value: 47 
Character is: D, its ascii value: 68 
Character is: o, its ascii value: 111 
Character is: c, its ascii value: 99 
Character is: u, its ascii value: 117 
Character is: m, its ascii value: 109 
Character is: e, its ascii value: 101 
Character is: n, its ascii value: 110 
Character is: t, its ascii value: 116 
Character is: s, its ascii value: 115 
Character is: /, its ascii value: 47 
Character is: p, its ascii value: 112 
Character is: r, its ascii value: 114 
Character is: o, its ascii value: 111 
Character is: g, its ascii value: 103 
Character is: /, its ascii value: 47 
Character is: I, its ascii value: 73 
Character is: O, its ascii value: 79 
Character is: /, its ascii value: 47 
Character is: c, its ascii value: 99 
Character is: o, its ascii value: 111 
Character is: r, its ascii value: 114 
Character is: r, its ascii value: 114 
Character is: e, its ascii value: 101 
Character is: c, its ascii value: 99 
Character is: t, its ascii value: 116 
Character is: _, its ascii value: 95 
Character is: o, its ascii value: 111 
Character is: u, its ascii value: 117 
Character is: t, its ascii value: 116 
Character is: p, its ascii value: 112 
Character is: u, its ascii value: 117 
Character is: t, its ascii value: 116 
Character is: ., its ascii value: 46 
Character is: t, its ascii value: 116 
Character is: x, its ascii value: 120 
Character is: t, its ascii value: 116 
, its ascii value: 13 
Character is: 
, its ascii value: 10 

輸出爲的test.txt:

Character is: T, its ascii value: 84 
Character is: h, its ascii value: 104 
Character is: i, its ascii value: 105 
Character is: s, its ascii value: 115 
Character is: , its ascii value: 32 
Character is: i, its ascii value: 105 
Character is: s, its ascii value: 115 
Character is: , its ascii value: 32 
Character is: a, its ascii value: 97 
Character is: , its ascii value: 32 
Character is: t, its ascii value: 116 
Character is: e, its ascii value: 101 
Character is: s, its ascii value: 115 
Character is: t, its ascii value: 116 
Character is: , its ascii value: 32 
Character is: f, its ascii value: 102 
Character is: i, its ascii value: 105 
Character is: l, its ascii value: 108 
Character is: e, its ascii value: 101 
Character is: 
, its ascii value: 10 
Character is: W, its ascii value: 87 
Character is: h, its ascii value: 104 
Character is: y, its ascii value: 121 
Character is: , its ascii value: 32 
Character is: i, its ascii value: 105 
Character is: s, its ascii value: 115 
Character is: n, its ascii value: 110 
Character is: ', its ascii value: 39 
Character is: t, its ascii value: 116 
Character is: , its ascii value: 32 
Character is: t, its ascii value: 116 
Character is: h, its ascii value: 104 
Character is: e, its ascii value: 101 
Character is: r, its ascii value: 114 
Character is: e, its ascii value: 101 
Character is: , its ascii value: 32 
Character is: c, its ascii value: 99 
Character is: a, its ascii value: 97 
Character is: r, its ascii value: 114 
Character is: r, its ascii value: 114 
Character is: i, its ascii value: 105 
Character is: a, its ascii value: 97 
Character is: g, its ascii value: 103 
Character is: e, its ascii value: 101 
Character is: , its ascii value: 32 
Character is: r, its ascii value: 114 
Character is: e, its ascii value: 101 
Character is: t, its ascii value: 116 
Character is: u, its ascii value: 117 
Character is: r, its ascii value: 114 
Character is: n, its ascii value: 110 
Character is: , its ascii value: 32 
Character is: c, its ascii value: 99 
Character is: h, its ascii value: 104 
Character is: a, its ascii value: 97 
Character is: r, its ascii value: 114 
Character is: 
, its ascii value: 10 
Character is: a, its ascii value: 97 
Character is: t, its ascii value: 116 
Character is: , its ascii value: 32 
Character is: t, its ascii value: 116 
Character is: h, its ascii value: 104 
Character is: e, its ascii value: 101 
Character is: , its ascii value: 32 
Character is: e, its ascii value: 101 
Character is: n, its ascii value: 110 
Character is: d, its ascii value: 100 
Character is: , its ascii value: 32 
Character is: o, its ascii value: 111 
Character is: f, its ascii value: 102 
Character is: , its ascii value: 32 
Character is: e, its ascii value: 101 
Character is: a, its ascii value: 97 
Character is: c, its ascii value: 99 
Character is: h, its ascii value: 104 
Character is: , its ascii value: 32 
Character is: l, its ascii value: 108 
Character is: i, its ascii value: 105 
Character is: n, its ascii value: 110 
Character is: e, its ascii value: 101 
Character is: , its ascii value: 32 
Character is: i, its ascii value: 105 
Character is: n, its ascii value: 110 
Character is: , its ascii value: 32 
Character is: t, its ascii value: 116 
Character is: h, its ascii value: 104 
Character is: i, its ascii value: 105 
Character is: s, its ascii value: 115 
Character is: , its ascii value: 32 
Character is: f, its ascii value: 102 
Character is: i, its ascii value: 105 
Character is: l, its ascii value: 108 
Character is: e, its ascii value: 101 
Character is: ?, its ascii value: 63 
Character is: 
, its ascii value: 10 

我注意到了幾件事,並且找不到答案:
首先,如test.txt文件建議,爲什麼在這個文件的每行末尾沒有'/ r'char ,而在config.txt中有'/ r''/ n'在每行的結尾?
二,爲什麼「字符是」字樣消失在它印刷的線條上「,其ASCII值爲13」 ??

謝謝。

回答

5

當打印到控制檯窗口(即不是文件)時,\r指示它返回到行的開頭(因此您的「Character is」文本消失)。然而,\n指示它走下一條線。例如,\r對於顯示同一行上的進度很有用。

文件可以被保存或者\r\n\n\r在每行的末尾(見下文評論),這幾天被解釋的文本編輯器一樣(其實很多警告你,如果你混的文件中的類型)。看起來你有一個文件\r\n,另一個文件只有\n

+0

某些系統在一行的末尾還使用'\ r'保存文件,所以選項是'\ n'(對於類似nix的系統),'\ r \ n'(主要是窗口)和'\ r'(老蘋果機器人,在某些情況下OS X,我似乎記得) –

+0

酷 - 更新的答案包括'\ r'。謝謝! – noelicus

+0

如果OP不想編寫代碼來「壓扁」任何可能的CR/LF,我建議使用'fopen'以文本模式('「rt」')和'fgets'打開文件。 – usr2564301

0

我無法回答這兩個文件之間的差異,因爲我沒有它們,也沒有辦法創建它們。

這就是說,ASCII值13和ASCII值10是不可打印的字符。意思是,除非你檢測並翻譯了看起來是用於控制回車和/或換行到\r\n的看不見的字符的值,那麼你就不會「看見」它。

1

「Character is」消失的原因是\ 13字符是回車符。它將光標放回到行的開頭,這樣文本的其餘部分「,其ascii值是...」將覆蓋它。

只有\ n(新行)或\ r \ n(回車和新行)纔有效。

2

行尾差異可能由各種原因引起,例如,使用不同的文本編輯器。

至於\n\r人物,他們執行以下操作:

  • \n插入符移動到下一行
  • \r將插入符移動到當前行的開頭

有了這些知識,你應該能夠理解程序的輸出。這是「正常」的角色:

Character is: t, its ascii value: 116 

這是\r,注意插入符號是如何被移動到行的開頭時,它已經被印:

, its ascii value: 13 

這是\n,注意如何插入符號已經移動到下一行的時候已經打印了:

Character is: 
, its ascii value: 10 
+0

謝謝大家的好評! 這解釋了很多。 –

1

的第一個問題是我們無法解決的,因爲我們不知道如何將文件被創建。 Windows程序通常使用'\ r \ n',而Linux'\ n'就足夠了。

第二個問題很容易回答,你打印「字符是:\ n,它...」,所以你會得到一個換行符。除非你轉義特殊字符,否則你不能打印換行符。

編輯您可能想要越過\ r & \ n,就像標籤和其他人一樣。請參閱here

+1

「我們無法解決第一個問題,因爲我們不知道文件是如何創建的,Windows程序通常使用'\ r \ n',而對於Linux'\ n'就足夠了。」很棒,這正是我在第一個問題中尋找的答案,這取決於文件的創建方式和位置,這是我需要的信息...... –