C++ 访问“文件”中的信息;。txt";归档并转到确定的行

C++ 访问“文件”中的信息;。txt";归档并转到确定的行,c++,file-io,newline,text-parsing,getline,C++,File Io,Newline,Text Parsing,Getline,访问文本文件时,我希望从特定行读取。假设我的文件有1000行,我想读第330行。每行有不同数量的字符,可能相当长(假设每行大约100000000个字符)。我认为fseek()在这里不能有效使用 我正在考虑一个循环来跟踪换行符,但我不知道如何确切地实现它,我也不知道这是否是最好的解决方案 您能提供任何帮助吗?我认为您需要扫描文件并计算\n出现的次数,因为您找到了所需的行。如果这是一个频繁的操作,并且您是唯一一个编写该文件的人,那么您可以将包含此类信息的索引文件与包含数据的索引文件并排保存,这是一种

访问文本文件时,我希望从特定行读取。假设我的文件有1000行,我想读第330行。每行有不同数量的字符,可能相当长(假设每行大约100000000个字符)。我认为
fseek()
在这里不能有效使用

我正在考虑一个循环来跟踪换行符,但我不知道如何确切地实现它,我也不知道这是否是最好的解决方案


您能提供任何帮助吗?

我认为您需要扫描文件并计算\n出现的次数,因为您找到了所需的行。如果这是一个频繁的操作,并且您是唯一一个编写该文件的人,那么您可以将包含此类信息的索引文件与包含数据的索引文件并排保存,这是一种“穷人索引”,但是可以节省大量时间。

如果不扫描整个文件,找到换行符,然后计数,就无法知道任意文本文件中第330行的起始位置


如果你只需要做一次,然后扫描。如果需要多次扫描,则可以扫描一次,并建立一个数据结构列表,列出所有行的起始位置。现在,您可以找到在哪里阅读这一行。如果您还在考虑如何组织数据,我建议使用其他类型的数据结构进行随机访问。在不知道您要解决的实际问题的情况下,我不能推荐哪一个。除非您在文件中有某种索引,上面写着“行M从位置N开始”,否则您必须从文件中读取字符并计算换行数,直到找到所需的行

如果要保存每行的内容,可以使用
std::getline
轻松地读取行;如果要放弃所读取行的内容,直到找到所需行,则可以使用
std::istream::ignore

尝试在循环中运行

/* fgets example */
#include <stdio.h>

int main()
{
   FILE * pFile;
   char mystring [100];

   pFile = fopen ("myfile.txt" , "r");
   if (pFile == NULL) perror ("Error opening file");
   else {
     fgets (mystring , 100 , pFile);
     puts (mystring);
     fclose (pFile);
   }
   return 0;
}
/*fgets示例*/
#包括
int main()
{
文件*pFile;
char mystring[100];
pFile=fopen(“myfile.txt”、“r”);
如果(pFile==NULL)perror(“打开文件时出错”);
否则{
fgets(mystring,100,pFile);
puts(mystring);
fclose(pFile);
}
返回0;
}

在文件上创建索引。您可以“惰性地”执行此操作,但在读取缓冲区已满时,您还可以扫描每个字符

如果它是Windows上使用2字节“\n”的文本文件,则在换行符出现点读取的字符数将不是偏移量。因此,您应该在每次调用getline()之后进行“查找”

比如:

std::vector< off_t > lineNumbers;
std::string line;
lineNumbers.push_back(0); // first line begins at 0
while( std::getline( ifs, line ) )
{
   lineNumbers.push_back(ifs.tellg());
}
std::vector行号;
std::字符串行;
行号。向后推(0);//第一行从0开始
while(std::getline(ifs,line))
{
linenumber.push_back(ifs.tellg());
}

最后一个值将告诉您EOF在哪里。

我想您的意思是“已确定”。:)离题,但“我有一个疑问”是一个英语错误。你是说,“我有一个问题”或“我有一个我正试图解决的问题”。“怀疑”就是对断言持怀疑态度。例如,“他说它重10公斤,但我怀疑它。”或者“我毫不怀疑你能举起它。”@tenfour:对不起,这根本不是一个错误。“我有一个疑问。”这不是英语母语人士在任何地区的标准用法。我的评论是为了托马斯的最大利益。例如,我熟悉布鲁塞尔的英语使用情况,其中大部分是基于说话者的母语滥用英语。例如说荷兰语的人经常提到“站在桌子上的杂志”。它的错误不足以被误解,但它的错误足以被纠正。“我有疑问。”属于同一类。我不会在字典里查什么是“对的”,只是因为人们说它不正确。是的!假设文件被写入后,每行的末尾都被写入"myfile@thomas:在编写文件时,您可以找出换行符的位置。但是如果你当时不保存这些信息,那么当你阅读时,你就不知道它们现在在哪里。是的!假设当我的文件被写入时,每一行的末尾都被写入“我的文件问题是,如果我必须阅读行中的所有信息,那么这个过程将太长。假设每行有1000000000个字符。如果我想得到第330行的前十个不同字符,读前面所有不同的行是没有意义的,对吗??有什么想法吗?这是有道理的,因为没有预先构建的索引就没有其他方法了。断线没什么特别的;你也可以数字母“k”的出现次数。你必须扫描文件。“行”是由文本文件格式定义的专业,而不是由文件系统本质上定义的。