为什么一个空白行占据两个字节?

4

我刚开始学习C++。我想要统计文本文件末尾的空白行数。但是我现在遇到了一个问题,文本文件的内容如下:

test.txt

1
2
blank line

代码如下:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ifstream inFile("test.txt",ios::in);
    if (!inFile.good())
    {
        cout << "error" << endl;
    }

    inFile.clear();
    inFile.seekg(-1, ios::end);
    char a;
    inFile.get(a);
    cout << "symbol for a: " << a << "ASCII: " << (int)a << endl;

    inFile.clear();
    inFile.seekg(-2, ios::end);
    char b;
    inFile.get(b);
    cout << "symbol for b: " << b << "ASCII: " << (int)b << endl;
}

结果如下:
symbol for a: // a stands for the last character which is '\n'
ASCII: 10
symbol for b: // b stands for the second last character, which should be "2"
ASCII: 10

在上面展示的结果中,b 的值也是 \n。为什么?

6
如果你想使用 seekg 进行操作,请以二进制模式打开文件。以文本模式打开并使用 seekg 的文件会给你带来意外惊喜。 - PaulMcKenzie
1个回答

4
在Windows系统上,每个新行(newline)会产生两个ASCII字符"\r\n"(回车符,换行符)[10,13]。打开任何源代码文件,在十六进制编辑器中都可以看到每行末尾的这两个字符。

1
非常感谢!但是为什么'b'的值也是'\n'而不是'\r'? - Oliver Yu
我更喜欢使用stdio.h通过stdout进行文件操作,所以我对iostream不是很熟悉,但我想知道如果您已经读取了一个字符,那么seek end - 2是否正确,因为如果我记得正确的话,结束位置会变成缓冲区中下一个字符。我还注意到像Paul建议的那样在文本模式下打开文件。fopen(file,'t+')的行为方式使我不得不使用fopen(file,'w+')来避免不必要的复杂性。 - Stephen Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接