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

Accessing specific lines of text file c++

本文关键字:c++ 文本 文件 访问      更新时间:2023-10-16

我想访问文本文件中的特定行以显示或修改该行。我的文本文件包含不同长度的行,我听说这些文件不能使用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;
}    
string line8;
file >> line8;

将仅提取,直到命中第一个空白字符为止。

你可以使用类似的东西:

string line8;
getline(file, line8);

这至少对我来说适用于您在带有VS2012 的Windows7上的其余代码

标准C++11(以及该标准的早期版本)没有包含在文件中的行的概念。POSIX(甚至Windows或MacOSX)也没有。文本文件通常包含可变长度的行(只有行终止符是相关的,nrnnr,这取决于操作系统,可能还取决于文件读取模式(二进制或文本)。

在20世纪60年代或70年代,IBM大型机OS/360操作系统有"文件"系统,这些系统确实有由固定长度的线组成的文件,模仿穿孔卡

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

对于/etc/fstab(或/proc/mounts)来说,读取矢量中的所有行是个好主意,因为它总是一个小文件。它通常只有不到几十行,每行通常不到一百个字符。病理病例可能是一个有数千行评论的文件,但这在实践中并没有真正发生。