【问题标题】:why does a blank line occupy to two bytes?为什么一个空行占用两个字节?
【发布时间】:2020-07-24 20:22:11
【问题描述】:

我是 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。为什么?

【问题讨论】:

  • 如果您想做这些seekg 的事情,请以二进制模式打开您的文件。以文本模式打开并使用seekg 的文件会给您带来惊喜。

标签: c++ istream seekg


【解决方案1】:

在 Windows 上,换行符生成两个 ascii 字符“\r\n”(回车,换行)[10,13] 在十六进制编辑器中打开任何源代码,您会在每行末尾看到两个字符。

【讨论】:

  • 非常感谢!但是为什么'b'的值也是'\n'而不是'\r'呢?
  • 我首选的文件操作是通过 stdio.h 使用 stdout,所以我对 iostream 不太熟悉,但我想知道 seek end - 2 是否正确,因为如果你已经读过一个字符,那么结尾将成为下一个如果我记得的话,缓冲区中的字符。 Id 还需要注意有关以 Paul 建议的文本模式打开文件的信息。 fopen(file,'t+') 的行为方式让我做 fopen(file,'w+') 的事情来避免不必要的并发症。
猜你喜欢
  • 2022-07-06
  • 1970-01-01
  • 2015-11-30
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多