c++用fread读取数据问题
我想用类似fread的函数读取stdin文件中的数据。数据格式如下:12342345.....就是每一行会有两个数一共有100w行,怎么才能把每行的数据存储在数组里面呢啊...
我想用类似fread的函数读取stdin文件中的数据。数据格式如下:
12 34
23 45
.....
就是每一行会有两个数一共有100w行,怎么才能把每行的数据存储在数组里面呢啊。
比如把12存在a[0][0]中,34 存在a[0][1]中。
当然如果大神们有不用fread函数的更好,这个毕竟是二进制数据块读取,转化成数组太麻烦了。
可是也不能用scanf这样的来读。因为这个有时间限制,就是读取100w行这样的数据时间要在2s内。
求教大神们给点好的点子吧。 展开
12 34
23 45
.....
就是每一行会有两个数一共有100w行,怎么才能把每行的数据存储在数组里面呢啊。
比如把12存在a[0][0]中,34 存在a[0][1]中。
当然如果大神们有不用fread函数的更好,这个毕竟是二进制数据块读取,转化成数组太麻烦了。
可是也不能用scanf这样的来读。因为这个有时间限制,就是读取100w行这样的数据时间要在2s内。
求教大神们给点好的点子吧。 展开
展开全部
可以建议这样:用fgets读取每一行的字符。然后用sscanf进行字符串解析,获取每行字符串的两个整数。
假设FILE* fp=stdin;
那么关键代码有:
char buffer[88];
for(int i=0;;++i) {
if(fgets(buffer,88,fp)==NULL) //读到文件末尾
break;
sscanf(buffer,"%d %d",&a[i][0],&a[i][1]);
}
假设FILE* fp=stdin;
那么关键代码有:
char buffer[88];
for(int i=0;;++i) {
if(fgets(buffer,88,fp)==NULL) //读到文件末尾
break;
sscanf(buffer,"%d %d",&a[i][0],&a[i][1]);
}
追问
貌似这个效率更低,,还不如我直接fscanf函数读到数组里面呢,你这里循环进行读数据块,每次读一行读了n次,不如一次把所有数据都读出来。然后在赋值,可是我就是不知道怎么把数据读出来以后在赋值了
追答
这个怎么会比fscanf效率低?看清楚是每次fgets是一整行,循环N次就是N行。
fscanf效率低的原因,在于为了实现不同数据类型的识别,将文件IO拆分成了很多细碎的读取操作,而且可能在分析过程中有回退。就这一点来看,性能肯定是不如fgets+sscanf。
想效率再高也行。最高效率的操作,应该是一次读取完整个文件到内存,然后对整块内存进行操作,进行格式分析并转整数。如果说你读的内容是磁盘文件那没得说,关键是你的stdin支持这么玩么?输入效率跟得上?
最高效的可以这么玩:
FILE* fp=...
int file_size=get_file_size(fp); //获取文件总长度,fseek和ftell实现
char* buffer=new char [fillesize+1];
fread(buffer,1,file_size,fp);
int x=0;
for(char* sp=buffer;;) {
char* ep=NULL;
int v=strtol(sp,&ep,10); //分析整数,并在ep返回分析完整数后面的字符指针位置
if(v==0 && *ep==0) break;
a[x/2][x%2]=v;
++x;
sp=ep+1;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询