访问特定行的文本文件c ++

时间:2013-11-22 11:11:20

标签: c++

我想访问文本文件中的特定行以显示或修改该行。我的文本文件包含不同长度的行,我听说不能使用seekg或seekp这样的文件。我有一个代码,但它不起作用。有人可以告诉我一些其他有用的想法吗?

#include <fstream>
#include <limits>
#include <string>
#include <iostream>

std::fstream& GotoLine(std::fstream& file, unsigned int num)
{
    file.seekg(std::ios::beg);
    for(unsigned int i=0; i < num - 1; ++i)
    {
        file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
    }
    return file;
}

int main()
{
    using namespace std;

    std::fstream& GotoLine(std::fstream& file, unsigned int num);
    cout << "Starting..." << endl;
    fstream file("bla.txt");
    GotoLine(file, 8);
    string line8;
    file >> line8;
    cout << "[" << line8 << "]" << endl;
    // cin.get();
    cout << "Finished..." << endl;
    return 0;
}    

2 个答案:

答案 0 :(得分:1)

标准C++11(以及标准的早期版本)没有文件中包含的行的概念。此外POSIX(甚至Windows或MacOSX)也没有它。文本文件通常包含可变长度的行(并且只有行终止符是相关的,\n\r\n\n\r,具体取决于操作系统和文件读取模式--binary或textual-)。

在20世纪60年代或70年代,IBM大型机{{​​3}}操作系统具有“文件”系统,这些系统的文件由固定长度的线组成,模仿穿孔卡。

因此,您必须逐行阅读您的文件,并记住行限制在哪里(或使用OS/360跳过\n)。 或者,使用std::vector<std::string> - s上的std::istream::ignore将文件的每一行读入std::ifstream

对于/etc/fstab(或/proc/mounts)读取向量中的所有行是个好主意,因为它总是一个小文件。它通常少于几十行,通常少于约一百个字符。病理案例可能是一个包含数千行注释的文件,但实际上并没有真正发生。

答案 1 :(得分:1)

string line8;
file >> line8;

只会在第一个空格字符被击中之前提取。

你可以使用类似的东西:

string line8;
getline(file, line8);

至少在Windows 7上使用VS2012的其余代码对我有用了