加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

fread、fwrite实现大文件读写

(2011-07-13 10:20:13)
标签:

fread

fwrite

读写文件

跳着读

跳着写

分类: Matlab

最近在分析一个35G的大数据文件,猛一看,是不是很吓人啊,不过还好,师兄写文件的格式非常规范,读取数据来也就很方便了,主要是使用了读写文件的两个函数fread和fwrite,下面用matlab简单尝试一下,对于这种文件读取的低级函数,c和matlab功能都是差不多的。

 

先来看fwrite,最简单的用法如下

%%
x = 1:15;
dataw = reshape(x, 5, 3);
disp(dataw)

%%
filename = 'test.bin';
hfile = fopen(filename, 'w');
fwrite(hfile, dataw, 'double');
fclose(hfile);

fwrite写矩阵,是按列来写的,即先写第一列,再第二列,以此类推。如上面的代码,x为

      11
      12
      13
      14
   10    15

如果把数据全部读出来,就是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

 

稍复杂的写法是,可以跳着写,就是每个数据先跳几个位置,然后再写数据,如上面的5X3矩阵,如果想按行来写,当然最简单的方式是先转置一下再写,但如果数据量非常大,而且还在另一个文件里,总不能先都读取进来,再转置、写,当然这只是一种特殊情况,但跳着写在某些时候确实是好的解决方法,如下实现按行写

%%
x = 1:15;
dataw = reshape(x, 5, 3);
disp(dataw)

len = 5;
count = 3;

%%
filename = 'test.bin';
hfile = fopen(filename, 'w');   
fwrite(hfile, zeros(count, 1), 'double'); % 先写一行0,因为fwrite总是先跳再写,对于第一行也要先跳,那就先在第一行补个零吧
for i = 1:count
    fseek(hfile, 8*i, 'bof'); % 常常要配合fseek使用
    fwrite(hfile, dataw(1:end, i), 'double', 8*(count-1));
end
fclose(hfile);

hfile = fopen(filename, 'r');
datar = fread(hfile, 100, 'double')
fclose(hfile);

结果如下

          11
          12
          13
          14
       10    15
datar =
     0
     0
     0
     1
     6
    11
     2
     7
    12
     3
     8
    13
     4
     9
    14
     5
    10
    15

 

fwrite写的文件再配合上fread读,那真是天作之合了,35G的数据也是浮云啊!

最简单的读取方式就是上面的

datar = fread(hfile, 100, 'double')

直接读取100个数据。当然更灵活的是跳着读,如下面的程序

%%
x = 1:15;
dataw = reshape(x, 5, 3);
disp(dataw)

%%
filename = 'test.bin';
hfile = fopen(filename, 'w');
fwrite(hfile, dataw, 'double');
fclose(hfile);

%% 跳着读
ind = 2; % 读第几时刻的数据
len = 5; % 一次数据的长度
hfile = fopen(filename, 'r');
fseek(hfile, 8*(ind - 1), 'bof');
datar = fread(hfile, 3, 'double', 8*(len - 1)); % double为8个字节
fclose(hfile);

disp(datar)

结果如下

      11
      12
      13
      14
   10    15
2
7
12

这意思就是,文件中存储的数据为1到15,但如果我想读取上面矩阵中的第一行,即1,6,11,那就可以跳着读,但注意跳着读时,第一个数据是不跳直接读的,帮助里的说明是skips skip bytes after reading each value,这是和fwrite不同的地方,skips skip bytes before writing each value,所以上面fwrite跳着写的时候要先补一下0,再跳着写,方便一些。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有