【问题标题】:Problem in using seekg() to read file in C++在 C++ 中使用 seekg() 读取文件的问题
【发布时间】:2020-07-04 14:10:19
【问题描述】:

我正在学习用C++读写文件,发现一个问题。

我的 test.txt 文件在 3 行中包含 3 个字符串:

abc
def
mnp

我的问题是:我不明白为什么我需要使用f.seekg(2, ios::cur); 而不是f.seekg(1, ios::cur); 我知道如何在 c++ 中使用seekg(),我认为我只需要忽略 1 个字节 通过getline() 函数获取下一行。

这是我的代码:

ifstream f;
    f.open("D:\\test.txt", ios::in);
    string str1, str2, str3;
    f >> str1;
    f.seekg(2, ios::cur);
    getline(f, str2);
    getline(f, str3);
    cout << str1 << " " << str2 << " " << str3 << endl;

【问题讨论】:

  • 你根本不需要寻找
  • 那为什么代码是2呢?你是从哪里弄来的?当你问他们时,作者对此有何看法?

标签: c++ seekg


【解决方案1】:

您遇到问题的原因例如在这里:
Why does std::getline() skip input after a formatted extraction?

但是关于您关于seekg 的实际问题。您以文本模式打开文件。这意味着当您读取文件时,C++ 代码中的换行符会作为单个字符'\n'。但是在磁盘上它们可能是别的东西,而且您似乎正在Windows 上运行您的代码。文本文件中的换行符通常是两个字节,CR(ASCII 代码 13)和 LF(ASCII 代码 10)。 读取或在文本模式下写入将为您执行 C++ 字符串中的单个字符与文件中的两个字节之间的转换。

seekg 处理偏移量并且不关心这一点,无论您以文本模式还是二进制模式打开文件,偏移量都是相同的。如果您使用seekg 跳过新行,您的代码将依赖于平台,在 Windows 上您需要跳过 2 个字节,如上所述,而在其他平台(如 Unix)中您只需跳过一个字节。

因此,请勿将seekg 用于此目的,请参阅链接问题以获得更好的解决方案。

【讨论】:

  • @babylearnmaths 没问题。请注意,在这里说“谢谢”的常用方式是支持答案。此外,当/如果您的问题得到满意的答案时,最好接受您最喜欢的答案(但如果您希望所有时区都有机会看到并回答您的问题,最好等待 24 小时)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
相关资源
最近更新 更多