转到文件中的特定行并阅读它
Go to a specific line in file and read it
问题描述
我有一个包含一组行的文件。 A
文件 1:
"Hello How are you"
"The cat ate the mouse"
基于用户作为输入给出的行的开头和结尾。我想转到文件中的每一行并提取它。
例如,如果用户输入 1 , 17 那么我必须转到行 1 大小为 17 个字符。他可以给出文件中的任意行号。
我阅读了以下答案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] = '[=11=]';
cout.write (buffer,length);
delete[] buffer;
}
此代码似乎使用行号作为字节偏移量。如果您寻求偏移“1”,文件将向前寻找 1 个字节,而不是 1 行。如果您寻求偏移量 2,则文件向前寻找 2 个字节,而不是 2 行。
要查找特定行,您需要读取文件并计算换行符的数量,直到找到所需的行。已经有代码可以做到这一点,例如 std::getline()
。如果你还不知道你想要的行的确切字节偏移量,你可以调用std::getline()
次数等于你想要的行号。
还要记住,文件的第一个字节位于偏移量 0 而不是偏移量 1,并且不同的平台使用不同的字节来指示行尾(例如,在 Windows 上它是 "\r\n"
, 在 Unix 上是 "\n"
)。如果您使用库函数来读取行,则应为您处理行尾。
问题描述
我有一个包含一组行的文件。 A
文件 1:
"Hello How are you"
"The cat ate the mouse"
基于用户作为输入给出的行的开头和结尾。我想转到文件中的每一行并提取它。
例如,如果用户输入 1 , 17 那么我必须转到行 1 大小为 17 个字符。他可以给出文件中的任意行号。
我阅读了以下答案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] = '[=11=]';
cout.write (buffer,length);
delete[] buffer;
}
此代码似乎使用行号作为字节偏移量。如果您寻求偏移“1”,文件将向前寻找 1 个字节,而不是 1 行。如果您寻求偏移量 2,则文件向前寻找 2 个字节,而不是 2 行。
要查找特定行,您需要读取文件并计算换行符的数量,直到找到所需的行。已经有代码可以做到这一点,例如 std::getline()
。如果你还不知道你想要的行的确切字节偏移量,你可以调用std::getline()
次数等于你想要的行号。
还要记住,文件的第一个字节位于偏移量 0 而不是偏移量 1,并且不同的平台使用不同的字节来指示行尾(例如,在 Windows 上它是 "\r\n"
, 在 Unix 上是 "\n"
)。如果您使用库函数来读取行,则应为您处理行尾。