我想用类似fread的函数读取stdin文件中的数据。数据格式如下:
12 34
23 45
.....
就是每一行会有两个数一共有100w行,怎么才能把每行的数据存储在数组里面呢啊。
比如把12存在a[0][0]中,34 存在a[0][1]中。
当然如果大神们有不用fread函数的更好,这个毕竟是二进制数据块读取,转化成数组太麻烦了。
可是也不能用scanf这样的来读。因为这个有时间限制,就是读取100w行这样的数据时间要在2s内。
求教大神们给点好的点子吧。
貌似这个效率更低,,还不如我直接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;
}
c++用fread读取数据问题
可以建议这样:用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]);} ...
C++语言fread函数读出来的内容为什么和原文不一样,以下是源码和运行图...
debug 模式下看到字符串输出 “烫”,说明读取到了不应该读取的内存。。。当 readfile 函数返回的时候,caption 这个数组已经被释放掉了。。。你可以改用 malloc 在堆里分配内存,但这样的话就要求调用者要手动把它 free 掉;这也是为什么 C 语言的很多函数如果要输出字符串,一般都是弄一个指针参数...
visual c++里怎么用fwrite和fread才能对学生数据库(结构体)既能输入数...
,fread和fwrite用于读写各种类型的数据块 第一个参数是读写数据的内存区的指针, 第2个是每一项的大小,第3个是项数, 第4个是文件指针.说简单点fwrite就是把结构体中的数据写入文件中,而fread就是从文件中把数据写入结构体中。例如:结构体变量student FILE *file;fwirte(&student,sizeof(student)...
用devc++时,提取一个txt中的数据赋值给一个数组,为什么2000个数据只...
1.如果你是用fread之类的函数读取的话,你定义的是不是char数组,如果不是的话很可能读取字符时系统会把几个字符放到一个中,这样看着好像就变少了。2.如果你的数组定义没有问题,你是怎么统计提取到的数据数量的?如果你采用测量字符长度的方法的话,当提取到的数据中有空格或回车时就停止计数了。3...
c++读取文件的最后一行为什么显示两行
因为feof判断文件结束是通过读取函数fread返回错误来识别的 简单的说,如果fread读的刚好是最后一个元素,此次feof是判断不出到文件末尾的,所以就再次进入循环体 此次fread会失败,但是没有做任何处理,继续执行的输出,其实这里输出的是上次读入的,因为本次读失败了 解决方法可以在 fread之后再加一个 if...
急!!!C++ 如何将数据读入数组???
用fread函数做:功 能: 从一个流中读数据 函数原型: size_t fread( void *buffer, size_t size, size_t count, FILE *stream );参 数:1.用于接收数据的地址(指针)(buffer)2.单个元素的大小(size) :单位是字节而不是位,例如读取一个int型数据就是4个字节 3.元素个数(count)4....
C++中fread读完以后会不会自动跳到下面一行?
fread不会自动跳到下一行,它会自动跳到你上次读取最后一个字符的下一个位置。也就是指针会自动移动,但是不一定是一行一行 移动的。ifstream file;file.getline()是每次读取文件的一行,然后将文件指针移动至下一行。
c++ 读写文件问题,VS2010C++
fopen 应该以读写方式或者只读方式打开文件。fread只读了文本文件中1个char类型的数据到b中,而printf中%s表示的是字符串而不是char。话说一般是while循环读到EOF标记的
C++怎么读取文件中的几个数字在将它们储存给相应的变量
比如在exe的当前文件夹的txt文档读取内容。include<iostream> #include<fstream> using namespace std; int main() { ifstream fin("in.txt"); int a; fin>>a; cout<<a<<endl; return 0; }
关于文件操作的小问题
fread函数可以在C++里用.fread函数 用于 二进制文件读。 如 players.txt 是 二进制文件,而且用 "rb" 方式打开,则可以用fread函数读。你可以用 fread 读入一个结构,但是否可以读入一个 class 我没试 过。如果你的 players.txt 是 用 fwrite (用 "wb" open) 写成的,你可以用 fread 读入 ...