我想访问文本文件中的特定行以显示或修改该行。我的文本文件包含不同长度的行,我听说不能使用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;
}
答案 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的其余代码对我有用了