【问题标题】:Problems using seekg in C++在 C++ 中使用 seekg 的问题
【发布时间】:2014-01-14 18:54:30
【问题描述】:

我正在通过这样的函数读取文件:

#include <iostream>
#include <fstream>
#include <string>
...
void readfile(string name){

    string line;
    int p = 0;
    ifstream f(name.c_str());

    while(getline(f,line)){
        p++;
    }
    f.seekg(0);
    cout << p << endl;        

    getline(f,line);
    cout << line << endl;
}

Mi 文件有 3 行:

first
second
third

我期望的输出:

3
first

相反,我得到:

3
(nothing)

为什么我的 seekg 不起作用?

【问题讨论】:

  • 如果在使用seekg 之前执行f.clear() 会发生什么?
  • @sftrabbit ...会发生什么?它有效...谢谢,速度很快。
  • 请注意,自 C++11 起,seekg 本身会清除 eofbit

标签: c++ file stream seekg


【解决方案1】:

因为如果流到达文件末尾(设置了eofbit),seekg() 将失败,这是由于您的getline 循环而发生的。正如 sftrabbit 所暗示的,调用 clear() 将重置该位,并且应该允许您正确搜索。 (或者您可以只使用 C++11,其中 seekg 将清除 eofbit 本身。)

【讨论】:

  • 显然在 C++11 中seekg 会自动清除eofbit
  • @sftrabbit C++11 的众多改进之一。感谢您的来信。
  • @sftrabbit 还会设置failbit吗?因为第一个循环只会在输入失败时停止。
【解决方案2】:

使用迭代器从文件中读取

std::fstream file( "myfile.txt", std::ios::out );
std::string data = std::string(
     std::istreambuf_iterator<char>( file ),
     std::istreambuf_iterator<char>() );

【讨论】:

  • 迭代器很好,但问题是为什么提供的方法不起作用,而不是是否有更好的方法(你所做的只是将工作从文件例程转移到字符串,也可以通过迭代器完成,但没有说明原始问题)。
猜你喜欢
  • 1970-01-01
  • 2013-12-28
  • 2013-04-28
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 2012-05-23
  • 2010-12-24
  • 1970-01-01
相关资源
最近更新 更多