2011-02-07 48 views
2

访问文本文件时,我想从特定行中读取。假设我的文件有1000行,我想读第330行。每行都有不同数量的字符,可能会很长(假设每行大约有100,000,000个字符)。我在想fseek()在这里不能有效使用。访问“.txt”文件中的信息并转到确定的行

我在想一个循环来跟踪换行符,但我不知道究竟如何实现它,我不知道这是否是最好的解决方案。

你能提供任何帮助吗?

+0

我认为你的意思是“确定”。 :) – Maxpm 2011-02-07 15:50:37

+1

偏离主题,但“我有疑问”是英语错误。你的意思是,“我有一个问题”或“我有一个问题,我正在努力解决”。 “怀疑”是对一个断言持怀疑态度。例如,“他说它重10公斤,但我怀疑它。”或者“我毫不怀疑你可以举起它。” – tenfour 2011-02-07 15:54:35

+0

@tenfour:对不起,这不是一个错误。这只是标准用法,与您习惯的英语版本不同。 – btilly 2011-02-07 16:00:29

回答

1

我认为你需要扫描的文件和计数\ n个出现的,因为你找到所需的行。如果这是一个频繁的操作,并且你是唯一一个你编写文件的人,你可能会将包含这些信息的索引文件与包含数据的索引文件并排排列,这是一种“穷人索引”,但可以节省很多时间。

2

没有办法知道在哪里行330点开始在任意的文本文件,而无需扫描整个文件,找到换行符,然后计数。

如果您只需要操作一次,然后扫描。如果您需要多次执行此操作,那么您可以扫描一次,然后建立一个数据结构列表,其中所有行都将启动。现在你可以找出在哪里寻求阅读这条线。如果你还在想如何组织数据,我会建议使用其他类型的数据结构进行随机访问。如果不知道您正在尝试解决的实际问题,我无法推荐哪一个。

3

除非你有某种指数的话说,文件中的“行M开始在位置N”,则必须从文件中读取字符和计数换行符,直到找到所需的行。

,如果你想,如果你想,直到你找到所需的线路可以放弃读行的内容,以节省每一行的内容,或std::istream::ignore您可以轻松地阅读使用std::getline线。

0

尝试在一个循环

/* 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; 
} 
1

运行fgets创建该文件的索引。你可以“懒惰地”这样做,但是当你读完一个缓冲区时,你可以为每个字符扫描它。

如果是使用2个字节的Windows上的文本文件“\ 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()); 
} 

最后的值会告诉你在哪里EOF是。