从接触C语言的文件处理到现在已经有一个月了,终于完成了第1步,正确读取存储。一直错着过来的,也明白了很多东西。
我要处理的是大小为24.1M的2进制文件,文件类型BIN。这第一个难点就是数据类型的理解,以前一直以为算法才是重要的,逻辑才是重要的,却忽视了最基本的数据类型和数据结构(现在才明白数据结构的重要,因为现实中处理的数据一般都很大)。到现在才知道,在内存中long型数据占4个字节,double型数据占8个字节。同一个文件,按照long型读取和double型读取读到的就不一样,内存中所有的数据是2进制的0,1码。1个字节有8位0和1构成。能存下最大的整数是2的8次方,也就是128,超过这个数九不能用字节char来表示了。long型是占4个字节,32位,最大可以表示的数就是2的32次方,这是个很大的数了。这也是32位计算机最大的寻址范围。这24.1M的数据里边存的就是long型,所以你读取的话就要4个字节4个字节的读取,如果是2进制的,也就是1次读32个连续的01,如果是16进制的,连续读8个就可以了。这24.1M数据,如果你用记事本打开,那么大部分你都会发现那是乱码,因为记事本是按ACSⅡ码读的,也就是1个字节一个字节读的,一个字节一个字节的解释。会按照每个字节所代表的字符来显示在记事本上,如果你用ultraEdit-32打开就会是16进制数。16进制数也是有讲究的。比如AA BB ,高字节是BB,低字节是AA。
C读文件,首先就是要把文件放到一个文件指针里,
FILE*fp=fopen("文件名字","存读方式"),这个FILE是一个结构体类型,存储的就是文件。fopen就是打开文件的方式(打开并不是读取)。经过刚才的话,fp这个指针就已经代表文件里的数据了。存读方式很重要,凡是没有b的都是文本文件的读取方式,有b的就是2进制的读取方式。带a的就是可以追加的,就是对已经存在的文件继续往它的文件尾写而不是覆盖掉他。
对于小的文件,可以直接建立数组,用它读用它写。
FILE*fp;
FILE*fp2;
long length=0;
char ch3;
long ch2[1000];
double ch4[1000];
int g;
double j[1000],l[1000],p[1000],q[1000];
double h[100];
fp2=fopen("lvbo3.bin","wb");
if((fp=fopen("10.bin","rb"))==NULL)
{
printf("cant open the file");
exit(0);
}
while(!feof(fp))
{fread(&ch3,1,1,fp);//从fp中读取所有字节。
length++;
}
fclose(fp);
length--;
if((fp=fopen("10.bin","rb"))==NULL)
{
printf("cant open the file");
exit(0);
}
if(fread(&ch2,4,1000,fp)!=1000)
printf("file read error\n");
fclose(fp);
这是刚开始用的模拟的,建立了能存1000个long型数据的数组。这能存4000个字节,也就是4K,但是当文件比较大时,比如上几十M,上百M,C就不支持数组了,也就是不允许建立大小为a[1024*1024*10]这样的数组(C#就支持)。所以要想用其他的方式,从内存入手,建立指针。指针其实就是一个数组。
long *a; *(a+1),就是a[1];内存动态分配用的是malloc函数,它可以存下据说好几G的东西
long*buffer;
buffer=(long*)malloc(总长度/4)。这就等于建了一个数组,就可以对buffer[i]进行操作了。
对于文件的读操作,fread函数,也出了很多错。从刚开始读不了大文件,只能读了到C20这个位置,后来是读到了dd40这个位置,后来又出了问题就是到10000h的时候又从文件头开始读。后来又是能读到600多K,然后是能读到6M,但是有错误,直到最后可以完整没错的。经过了2个月,进度有点慢,但是弄明白了确实有很多可以干的,文件复制,文件剪切,文件处理,mp3也是文件。
FILE*in;
FILE*out;
long*buffer;
long j,g,index;
double h[101];
out=fopen("2.bin","ab");
in=fopen("10.bin","rb");
fseek(in,0L,SEEK_END);
index=ftell(in);//得出字节长度
fseek(in,0L,SEEK_SET);
buffer=(long*)malloc(index/4);//开辟内存存数据
for(g=0;g<index/1000;g++)//分次进行读和取
{
fseek(in,1000*g,0);//移动指针
fread(buffer+g*1000,1000,1,in); //读取过了64K就会出现问题
for(j=0;j<250;j++)//1000个字节就是250个有效数据
{buffer[g*1000+j]=buffer[g*1000+j]+1;
}
fwrite(buffer+g*1000,1000,1,out);
}
fclose(in);//文件流关闭要在最后,关早了要出问题。
fclose(out);
}
最后是这样。复制的也可以用下边这种方法,更精简
#include"stdio.h"
main()
{
FILE*in,*out;
in=fopen("10.bin","rb");
out=fopen("1.bin","wb");
while(!feof(in))
{
fputc(fgetc(in),out);
}
fclose(in);
fclose(out);
getch();
;
},不过我感觉我写的有点麻烦,希望大家可以帮忙简化,比如开辟了那么大的内存是不是浪费等等。而且听说过链表,可以用链表来存大的数据。
我要处理的是大小为24.1M的2进制文件,文件类型BIN。这第一个难点就是数据类型的理解,以前一直以为算法才是重要的,逻辑才是重要的,却忽视了最基本的数据类型和数据结构(现在才明白数据结构的重要,因为现实中处理的数据一般都很大)。到现在才知道,在内存中long型数据占4个字节,double型数据占8个字节。同一个文件,按照long型读取和double型读取读到的就不一样,内存中所有的数据是2进制的0,1码。1个字节有8位0和1构成。能存下最大的整数是2的8次方,也就是128,超过这个数九不能用字节char来表示了。long型是占4个字节,32位,最大可以表示的数就是2的32次方,这是个很大的数了。这也是32位计算机最大的寻址范围。这24.1M的数据里边存的就是long型,所以你读取的话就要4个字节4个字节的读取,如果是2进制的,也就是1次读32个连续的01,如果是16进制的,连续读8个就可以了。这24.1M数据,如果你用记事本打开,那么大部分你都会发现那是乱码,因为记事本是按ACSⅡ码读的,也就是1个字节一个字节读的,一个字节一个字节的解释。会按照每个字节所代表的字符来显示在记事本上,如果你用ultraEdit-32打开就会是16进制数。16进制数也是有讲究的。比如AA BB ,高字节是BB,低字节是AA。
C读文件,首先就是要把文件放到一个文件指针里,
FILE*fp=fopen("文件名字","存读方式"),这个FILE是一个结构体类型,存储的就是文件。fopen就是打开文件的方式(打开并不是读取)。经过刚才的话,fp这个指针就已经代表文件里的数据了。存读方式很重要,凡是没有b的都是文本文件的读取方式,有b的就是2进制的读取方式。带a的就是可以追加的,就是对已经存在的文件继续往它的文件尾写而不是覆盖掉他。
对于小的文件,可以直接建立数组,用它读用它写。
FILE*fp;
FILE*fp2;
long length=0;
char ch3;
long ch2[1000];
double ch4[1000];
int g;
double j[1000],l[1000],p[1000],q[1000];
double h[100];
fp2=fopen("lvbo3.bin","wb");
if((fp=fopen("10.bin","rb"))==NULL)
{
printf("cant open the file");
exit(0);
}
while(!feof(fp))
{fread(&ch3,1,1,fp);//从fp中读取所有字节。
length++;
}
fclose(fp);
length--;
if((fp=fopen("10.bin","rb"))==NULL)
{
printf("cant open the file");
exit(0);
}
if(fread(&ch2,4,1000,fp)!=1000)
printf("file read error\n");
fclose(fp);
这是刚开始用的模拟的,建立了能存1000个long型数据的数组。这能存4000个字节,也就是4K,但是当文件比较大时,比如上几十M,上百M,C就不支持数组了,也就是不允许建立大小为a[1024*1024*10]这样的数组(C#就支持)。所以要想用其他的方式,从内存入手,建立指针。指针其实就是一个数组。
long *a; *(a+1),就是a[1];内存动态分配用的是malloc函数,它可以存下据说好几G的东西
long*buffer;
buffer=(long*)malloc(总长度/4)。这就等于建了一个数组,就可以对buffer[i]进行操作了。
对于文件的读操作,fread函数,也出了很多错。从刚开始读不了大文件,只能读了到C20这个位置,后来是读到了dd40这个位置,后来又出了问题就是到10000h的时候又从文件头开始读。后来又是能读到600多K,然后是能读到6M,但是有错误,直到最后可以完整没错的。经过了2个月,进度有点慢,但是弄明白了确实有很多可以干的,文件复制,文件剪切,文件处理,mp3也是文件。
FILE*in;
FILE*out;
long*buffer;
long j,g,index;
double h[101];
out=fopen("2.bin","ab");
in=fopen("10.bin","rb");
fseek(in,0L,SEEK_END);
index=ftell(in);//得出字节长度
fseek(in,0L,SEEK_SET);
buffer=(long*)malloc(index/4);//开辟内存存数据
for(g=0;g<index/1000;g++)//分次进行读和取
{
fseek(in,1000*g,0);//移动指针
fread(buffer+g*1000,1000,1,in); //读取过了64K就会出现问题
for(j=0;j<250;j++)//1000个字节就是250个有效数据
{buffer[g*1000+j]=buffer[g*1000+j]+1;
}
fwrite(buffer+g*1000,1000,1,out);
}
fclose(in);//文件流关闭要在最后,关早了要出问题。
fclose(out);
}
最后是这样。复制的也可以用下边这种方法,更精简
#include"stdio.h"
main()
{
FILE*in,*out;
in=fopen("10.bin","rb");
out=fopen("1.bin","wb");
while(!feof(in))
{
fputc(fgetc(in),out);
}
fclose(in);
fclose(out);
getch();
;
},不过我感觉我写的有点麻烦,希望大家可以帮忙简化,比如开辟了那么大的内存是不是浪费等等。而且听说过链表,可以用链表来存大的数据。