本文目录
- c语言怎么用二进制方式读取文件
- 弱弱的问个C语言的问题 关于二进制文件的读写
- c语言用什么函数读取2进制文件内容
- C语言读写二进制文本文件(.txt),如果可行,加200分,先谢过
- C语言怎么编写一个程序读取任何二进制文件,并将文件内所有字节按相反排序存入另一文件中
- c语言怎么读取二进制文件
- C语言读写二进制文件读取 大小端,该怎么解
c语言怎么用二进制方式读取文件
C语言中二进制文件的读取要用fread和fwrite来实现。 fwrite()与fprintf()是不同的。 fwrite将写入的数据作为文件的磁盘内容保存。fprintf将写入的数据的每个字符所对应的ASCII码作为文件的磁盘内容保存。fprintf做了一个转换的工作。
弱弱的问个C语言的问题 关于二进制文件的读写
linux操作系统不区分文本文件和二进制文件,只有在windows上才需要wb。你可以试验一下,到底默认是二进制还是文本的。二进制方式很简单,读文件时,会原封不动的读出文件的全部内容,写的时候,也是把内存缓冲区的内容原封不动的写到文件中。而文本方式就不一样了,在读文件时,会将换行符号CRLF(0x0D 0x0A)全部转换成单个的0x0A,并且当遇到结束符CTRLZ(0x1A)时,就认为文件已经结束。相应的,写文件时,会将所有的0x0A换成0x0D0x0A。所以,若使用文本方式打开二进制文件时,就很容易出现文件读不完整,或内容不对的错误。即使是用文本方式打开文本文件,也要谨慎使用,比如复制文件,就不应该使用文本方式。要特别注意的是,上面这样的说法仅适用于DOS和Windows系统。在Unix和其他一些系统中,没有文本方式和二进制方式的区分,使不使用’b’标志都是一样的。这是由于不同操作系统对文本文件换行符的定义,和C语言中换行符的定义有所不同而造成的。
c语言用什么函数读取2进制文件内容
你怎么输出的?二进制如果以文本输出,自然会有很多乱码。你可以用"%x"格式输出看看chara;a=fgetc(fp1);printf("%c",a);/*这样肯定有乱码*/printf("%x",a);/*这样就是16进制*/
C语言读写二进制文本文件(.txt),如果可行,加200分,先谢过
假定你用MS VC++ 6.0 编译器,不是TC.假定 第1、2、3、4字节表示分数, 是 int 型文件名 abc.txt如果还没有2进制文件,则可以自己建1个,假定数据为:// int mark={60,70,80,95,30};// char m={"zhang","wang","Li","Zhao","Fang"};打开写入:// fin=fopen(namein,"wb+");// for (i=0;i《n;i++) { fwrite(&mark,25,1,fin);}// fclose(fin);再运行。下面没有使用“结构”,分数存 mark. #include 《stdio.h》int main() { FILE *fin;char namein="abc.txt";int mark,t;char m;int i,j,n=0;fin=fopen(namein,"rb+");if (!fin){printf("open %s error\n",namein);}while(1){fread(&mark,4,1,fin);if (feof(fin)) break;fread(&m,25,1,fin);if (feof(fin)) break;n++;}printf("I read %d data\n",n);for (i=0;i《n;i++) printf("%d %s\n",mark); for (i=0;i《n-1;i++)for (j=i+1;j《n;j++){if (mark){t = mark=t;strcpy(ts,m,ts);}}rewind(fin);for (i=0;i《n;i++){ fwrite(&mark,25,1,fin);}fclose(fin);return 0;}
C语言怎么编写一个程序读取任何二进制文件,并将文件内所有字节按相反排序存入另一文件中
如果文件不大的话,可以定义一个数组,一次性将文件内容都读出来,然后从后向前写到新文件中,如果文件很大的话,就将文件指针定位到文件结尾的前一个字节处,循环读一个字节写入另一个文件,并将原文件指针往回移2个字节,直到将所有字节反向读取完成并写入。#include 《stdio.h》main(){ char c; FILE *rfp, *wfp;rfp = fopen("a.bin", "rb"); // 文件名自己指定 if(rfp == NULL) { printf("文件不存在\n"); return -2; }wfp = fopen("b.bin", "wb"); if(wfp == NULL) { printf("无法创建文件\n"); return -2; }fseek(rfp, -1, SEEK_END); do { fread(&c, sizeof(char), 1, rfp); fwrite(&c, sizeof(char), 1, wfp); } while(fseek(rfp, -2, SEEK_CUR) == 0);fclose(rfp); fclose(wfp);}
c语言怎么读取二进制文件
main(){FILE * stream;int i;stream = fopen("/tmp/fwrite","r");fread(s,sizeof(struct test),nmemb,stream);fclose(stream);for(i=0;i《nmemb;i++)printf("name.size);}供参考
C语言读写二进制文件读取 大小端,该怎么解
先看下面的代码,然后我在简短的解释一下。
#include 《stdio.h》#include 《stdlib.h》#include 《string.h》#include 《string》#define nmemb 7/**************************************************** Date types(Compiler specific) 数据类型(和编译器相关)*****************************************************/typedef unsigned char uint8; /* Unsigned 8 bit quantity */typedef signed char int8; /* Signed 8 bit quantity */typedef unsigned short uint16; /* Unsigned 16 bit quantity */typedef signed short int16; /* Signed 16 bit quantity */typedef unsigned int uint32; /* Unsigned 32 bit quantity */typedef signed int int32; /* Signed 32 bit quantity */typedef float fp32; /* Single precision */ /* floating point */typedef double fp64; /* Double precision */ /* floating point *///int32#define BigtoLittle32(A) ((( (uint32)(A) & 0xff000000 ) 》》 24) | \ (( (uint32)(A) & 0x00ff0000 ) 》》 8) | \ (( (uint32)(A) & 0x0000ff00 ) 《《 8) | \ (( (uint32)(A) & 0x000000ff ) 《《 24))//int16#define BigtoLittle16(A) (( ((uint16)(A) & 0xff00) 》》 8 ) | \ (( (uint16)(A) & 0x00ff ) 《《 8))/************************************************************* Conversion little endian float data to big endian* *************************************************************/float ReverseFloat(const float inFloat){ float retVal; char *floatToConvert = (char*) & inFloat; char *returnFloat = (char*) & retVal; // swap the bytes into a temporary buffer returnFloat; returnFloat; returnFloat; returnFloat; return retVal;}struct matrix{ int row; int column;}s;void set_s(int j, int x, int y){ s.row = x; s.column = y;}bool is_bigendian(){ int a = 0x1234; char b = *(char *)&a; //b == the Low address part of a //printf("%c\n", b); if (b == 0x34) { return false; } return true;}int main(){ if (is_bigendian()) { printf("BigEndian\n"); } else { printf("LittleEndian\n"); } FILE *fp; set_s(0, 1, 50); set_s(1, 1, 80); set_s(2, 4, 20); set_s(3, 50, 1); set_s(4, 80, 2); set_s(5, 100, 3); set_s(6, 100, 4); int ans = sizeof(struct matrix); printf("size: %d\n", ans); printf("size: %d\n", sizeof(s)); if ((fp = fopen("test", "wb")) == NULL) { printf("EROOR\n"); return 1; } for (int j = 0; j 《 nmemb; ++j) { printf("row: %d column: %d\n", s.column); } fwrite(s, sizeof(struct matrix), nmemb, fp); for (int i = 0; i 《 nmemb; ++i) { float *m = (float*) malloc(sizeof(float) * s.column); bzero(m, sizeof(float) * s.column; ++k) { m = k; } } fwrite(m, sizeof(float), s.column, fp); free(m); } fclose(fp); printf("11\n"); /* printf("%d\n", sizeof(float)); FILE *fp; if ((fp = fopen("test", "rb")) == NULL) { printf("EROOR\n"); return 1; } fread(s, sizeof(struct matrix), nmemb, fp); for (int i = 0; i 《 nmemb; ++i) { printf("row: %d column: %d\n", s.column); } for (int i = 0; i 《 nmemb; ++i) { float *m = (float*) malloc(sizeof(float) * s.column); bzero(m, sizeof(float) * s.column); fread(m, sizeof(float), s.column, fp); for (int j = 0; j 《 s.row; ++j) { for (int k = 0; k 《 s.column; ++k) { printf("%lf ", m); } printf("\n"); } printf("\n\n"); free(m); } fclose(fp); */ return 0;}fopen和fclose是很常见的,在这里就不做解释了。我们来看看fwrite和fread,本来以为这个很麻烦,但是用过之后发现这个二进制文件读写才是最简单的。
size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);fwrite()用来将数据写入文件流中。 stream为已打开的文件指针 ptr 指向欲写入的数据地址写入的字符数以参数size*nmemb来决定。 size表示写入一个nmemb的内存大小。 fwrite()会返回实际写入的nmemb数目。
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);fread()用来从文件流中读取数据。 stream为已打开的文件指针 ptr 指向欲存放读取进来的数据空间读取的字符数以参数size*nmemb来决定 size表示读取一个nmemb的内存大小。 fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb 小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。返回实际读取到的nmemb数目。
详情参见上面的代码。
另外就是大小端的问题了。关于大小端的具体解释网上有很多,在此不作解释。参考上面写的代码,我判断了自己机器是大端还是小端,并且实现了int16,int32已经float数据类型的大小端转换,大端转小端,在使用相同的代码一次小端又变成了大端。
PS:float的大小端转化我之前一直以为写的是错的,因为好多数据转化之后输出都是0。后来发现可能是与float类型在内存中的存放有关,我们的程序是对的。