读取文件一行

hmsuccess 2008-06-06 10:15:12
问题:我的测试文件很大,而且一行的字符数也是不定的,有512~100000之间,
我的问题是如何高效的读取每一行,
目前,我为了测试,使用char *BTemp = new char[100000];
isEof = (fgets(BTemp, 100000, file)==NULL);
这样还是太浪费内存了,谢谢回答!!!
...全文
635 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
WuRock1983 2008-06-18
  • 打赏
  • 举报
回复
CStdioFile file;
file.ReadString(); //读取一行
darkarthur 2008-06-10
  • 打赏
  • 举报
回复

#include <vector>
#include <string>
#include <fstream>
......
ifstream InFile;
vector<string> VecStr;
string TStr;
InFile.open(...);
while (InFile>>TStr)
{
VecStr.pushback(TStr);
}

这样一行是一个string
易于处理
Crob 2008-06-09
  • 打赏
  • 举报
回复
最快的方法是用C++标准库,把内存总是交给标准库来处理吧,遍历一个文本文件每一行代码如下:
遍历e:\list.txt文件中的每一行,保存到sline中并打印到屏幕上

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char *argv[])
{
ifstream ifs("e:/list.txt");
string sline;
while(ifs && getline(ifs, sline)){
cout << sline << endl;
}
ifs.close();


system("PAUSE");
return EXIT_SUCCESS;
}
帅得不敢出门 2008-06-07
  • 打赏
  • 举报
回复
CStdioFile file;
.....
file.ReadString(); //读取一行
jacknes009 2008-06-07
  • 打赏
  • 举报
回复
getline
luhongyu2108 2008-06-06
  • 打赏
  • 举报
回复
遍历行大小可以循环使用fgetc获取字符检测'\n',记录下每一行的大小
hmsuccess 2008-06-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 babyvox1999 的回复:]
你要怕浪费内存就先遍历出行大小再动态分配好了
[/Quote]
请问,如何遍历行大小
babyvox1999 2008-06-06
  • 打赏
  • 举报
回复
你要怕浪费内存就先遍历出行大小再动态分配好了
飞哥 2008-06-06
  • 打赏
  • 举报
回复
关键是seek的比较浪费时间,考虑内存映射
evifree 2008-06-06
  • 打赏
  • 举报
回复
你可以声明一个适中的buffer,然后使用fgets, 遇到长的行就需要多次读取
lin_style 2008-06-06
  • 打赏
  • 举报
回复
试试这样
预分配内存是必须的,看你自己中间这个值怎么设定
先分配512K,这个可以自己选择
然后载入512K,接着判断字符串中数组是否等于512K,即测试下是否都读入了
如果不是\0,则将空间扩充到1MB,读入,再判断下长度,如果小于1MB,则表示读入,
当然,扩充到多少这个由你决定。

不过这样必然在realloc时浪费了。。
所以,多分配点内存没什么。。。空间换取效率。
况且,处理这么大的东西,不可能一直驻扎整个程序中吧。
ouyh12345 2008-06-06
  • 打赏
  • 举报
回复
不多,才不到100k,字符串数组就可以了
K行天下 2008-06-06
  • 打赏
  • 举报
回复
你说:测试文件很大,而且一行的字符数也是不定的,512~100000之间

我的看法是:
char *p;
p = (char *)malloc(512);
一次读入512字符,当然如果有'\n',就不必增加内存
如果不够,在realloc分配512直到读到'\n'为止!!

变态做法:一次分配一个字节,用fgetc, 判断是否'\n',不是在重新分配一字节,如此反复。。。。

主要是看到你的文件中一行的长度,定单位缓冲长度为512字节
gezichong 2008-06-06
  • 打赏
  • 举报
回复
windows核心编程中虚拟内存部分有详细讲解
gezichong 2008-06-06
  • 打赏
  • 举报
回复
每一行的数据不确定,不行麻烦的话可以讨论一下:
要检查一下每一行到底有多少个字符。。
如果小于1M的话,可以用字符数组,在于1M可以考虑用虚拟内存。

(虚拟内存主要调用VirtualAlloc等一系列函数)
vc_xx 2008-06-06
  • 打赏
  • 举报
回复
记得fread好像是每次读取一行,你可以试试

这个你可能会给你点想法
bool DealFile(string fileName) //随便写个函数说明
{
FILE *file;
DWORD fileSize ,pos;
int readLen ;

//MAX_BUFFER_LEN 在头文件里定义,这里能够保证数据不丢失,也不至于内存逸出
char *buffer = new char[MAX_BUFFER_LEN];
file = fopen(fileName.c_str(),"r+b");
if(file == NULL) return false;
fseek(file,0,2);
fileSize = ftell(file); //取得文件的大小
fseek(file,0,0);
do{
readLen = fread(buffer,sizeof(char),MAX_BUFFER_LEN,file);
if(readLen > 0)
{
pos += readLen;
//对读取的文件做处理
}
}while(pos < fileSize); //循环读取文件
delete[] buffer;
fclose(file); //释放资源
return true;
hmsuccess 2008-06-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luhongyu2108 的回复:]
遍历行大小可以循环使用fgetc获取字符检测'\n',记录下每一行的大小
[/Quote]
这样效率上是不是有点低啊,还有就是1楼说的,
但是如果我的增加到1000000是,那就是1m了,这样浪费的就更多了,
大家看看有没有什么好的办法,谢谢

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧