我有一个包含一组行的文件。一个
文件1:
"Hello How are you"
"The cat ate the mouse"
基于用户给出的行的开头和结尾作为输入。我想转到文件中的每一行并提取它。
例如,如果用户类型 1 , 17 ,那么我必须转到 1 ,其大小为 17 < / strong>字符。他可以在文件中提供任何行号。
我阅读了以下答案Read from a specific spot in a file C++。但我真的不明白。为什么线条大小必须相同?如果我有关于文件中每一行的开头和结尾的信息。为什么我无法直接访问它?
我尝试使用受Read Data From Specified Position in File Using Seekg启发的以下代码但是我无法提取这些行为什么?
#include <fstream>
#include <iostream>
using namespace std::
void getline(int, int, const ifstream & );
int main()
{
//open file1 containing the sentences
ifstream file1("file1.txt");
int beg = 1;
int end = 17;
getline(beg,end, file1);
beg = 2;
end = 20;
getline(beg,end, file1);
return 0;
}
void getline(int beg, int end, const ifstream & file)
{
file.seekg(beg, ios::beg);
int length = end;
char * buffer = new char [length];
file.read (buffer,length);
buffer [length - 1] = '\0';
cout.write (buffer,length);
delete[] buffer;
}
答案 0 :(得分:3)
此代码似乎使用行号作为字节偏移量。如果你试图抵消&#34; 1&#34;该文件寻找前向1个字节,而不是1行。如果你试图偏移2,文件寻找前2个字节,而不是2行。
要搜索特定行,您需要读取文件并计算换行符的数量,直到找到所需的行。有代码已经执行此操作,例如std::getline()
。如果您还不知道所需行的字节偏移量,则可以将std::getline()
的次数称为所需的行号。
还要记住,文件的第一个字节位于偏移0而不是偏移1,并且不同的平台使用不同的字节来指示一行的结尾(例如,在Windows上它是"\r\n"
, Unix它的"\n"
)。如果您正在使用库函数来读取行,则应该为您处理行结束。