简体   繁体   English

文件中的回车符

[英]Carriage return character in files

Can someone please solve this mystery for me...? 有人可以为我解决这个谜题吗?
I read about the differences between '/r' and '/n', and that's not what I want to ask... 我读到了关于'/ r'和'/ n'之间的区别,这不是我要问的...

Consider this two files: 考虑以下两个文件:
config.txt: 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: test.txt:

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

Now, consider the following code: 现在,考虑以下代码:

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);
    }
}

Just ignore potential bugs for a moment, since this is not the issue here (I hope). 请暂时忽略潜在的错误,因为这不是这里的问题(我希望)。 This code will just print each character in the file, and it's ascii value. 这段代码只会打印文件中的每个字符,它是ascii值。

Now, watch what happens when I run it on the above files... 现在,观察当我在上述文件上运行它时会发生什么...
Output for config.txt: 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

Output for test.txt: 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

Couple of things that I noticed, and couldn't find an answer for: 我注意到的几件事,找不到以下答案:
First, as the test.txt file suggests, why isn't there '/r' char at the end of each line in this file, while in config.txt there are both '/r' and '/n' at the end of each line?? 首先,如test.txt文件所建议的,为什么在此文件的每一行末尾都没有'/ r'char ,而在config.txt中 ,末尾同时有'/ r' '/ n'每行??
Second, why did the words "Character is" disappear at the lines where it printed ", its ascii value is 13" ?? 其次,为什么“ Character is”一词在其印刷“ ascii值为13”的行中消失了?

Thanks. 谢谢。

When printing to a console window (ie not a file) the \\r instructs it to go back to the beginning of a line (hence your "Character is" text disappears). 当打印到控制台窗口(即不是文件)时, \\r指示它返回到行的开头(因此,“ Character is”文本消失了)。 The \\n , however, instructs it to go the next line. \\n指示它前进到下一行。 The \\r is useful for showing progress on the same line, for example. 例如, \\r可用于在同一行上显示进度。

Files can be saved with either \\r\\n , \\n , or a \\r at the end of each line (see comment below), and these days are interpreted the same by text-editors (in fact many warn you if you mix the types within a file). 可以在每行末尾用\\r\\n\\n\\r保存文件(请参见下面的注释),并且文本编辑器对这些天的解释相同(实际上,如果您混合使用,则会警告您)文件中的类型)。 It would appear you have one file with \\r\\n and the other with just \\n in. 看来您有一个带有\\r\\n文件,而另一个只有\\n in。

End of line differences can be caused by various reasons, eg different text editors used. 行尾差异可能是由多种原因引起的,例如,使用了不同的文本编辑器。

As for \\n and \\r characters, they do the following: 对于\\n\\r字符,它们执行以下操作:

  • \\n moves the caret to the next line \\n将插入符号移至下一行
  • \\r moves the caret to the beginning of the current line \\r将插入符号移动到当前行的开头

With this knowledge you should be able to understand the output of the program. 有了这些知识,您就应该能够理解程序的输出。 This is 'normal' character: 这是“正常”字符:

Character is: t, its ascii value: 116

This is \\r , note how caret has been moved to the beginning of the line when it has been printed: 这是\\r ,请注意打印时插入记号如何移动到行的开头:

, its ascii value: 13

This is \\n , note how caret has been moved to the next line when it has been printed: 这是\\n ,请注意打印时插入符号如何移动到下一行:

Character is: 
, its ascii value: 10

The reason "Character is" disappears is that the \\13 character is a carriage return. “ Character is”消失的原因是\\ 13字符是回车符。 It puts the cursor back to the beginning of the line, so that the rest of the text ", its ascii value is ..." overwrites it. 它将光标放回到该行的开头,以便文本“”,其ascii值为...”的其余部分覆盖它。

It is valid to have just \\n (new line) or \\r\\n (carriage return and new line). 仅\\ n(换行)或\\ r \\ n(回车和换行)是有效的。

The first question is unsolvable by us, since we don't know how the files were created. 我们无法解决第一个问题,因为我们不知道文件是如何创建的。 Windows programs usually use '\\r\\n' while for Linux '\\n' is enough. Windows程序通常使用“ \\ r \\ n”,而Linux则使用“ \\ n”就足够了。

The second question is easy to answer, you print "Character is: \\n, its ..." so you get a newline. 第二个问题很容易回答,您打印“ Character is:\\ n,它的...”,这样您就可以换行了。 You can't print a newline without getting one, unless you escape special characters. 您必须先换行才能换行,除非您转义了特殊字符。

edit You may want to escape more then \\r & \\n, like tabs and others too. 编辑您可能想要转义\\ r&\\ n以外的内容,例如制表符和其他。 See here 这里

I can't answer the differences between the two files because I do not have them in my possession nor do I have a way to create them. 我无法回答这两个文件之间的差异,因为我没有它们,也没有创建它们的方法。

That being said, ASCII Value 13 and ASCII Value 10 are non-printable characters. 就是说,ASCII值13和ASCII值10是不可打印的字符。 Meaning, unless you detect and translate the value from what seemingly is an invisible character used to control carriage return and/or line feed to either \\r or \\n , then you aren't going to "see" it. 意思是,除非您从看似用来控制回车和/或换行符到\\r\\n看似不可见字符中检测并转换该值,否则您将不会“看到”它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM