C语言读写二进制文件(c语言怎么用二进制方式读取文件)

2024-08-17 04:30:06 :22

c语言读写二进制文件(c语言怎么用二进制方式读取文件)

其实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类型在内存中的存放有关,我们的程序是对的。

c语言怎么用二进制方式读取文件的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言怎么用二进制方式读取文件、c语言怎么用二进制方式读取文件的信息别忘了在本站进行查找哦。

c语言读写二进制文件(c语言怎么用二进制方式读取文件)

本文编辑:admin
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.