当前位置:首页 » 编程语言 » c语言读二进制文件

c语言读二进制文件

发布时间: 2022-12-09 02:19:05

c语言编程作业 急求 (读取2进制文件 输出16进制)万分感谢

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int
main(int
argc,
char
*argv[])
{
char
aa[]
=
"0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111";
char
bb[20];
char
cTmp[5];
int
tmp
=
0;
char*
p
=
NULL;
memset(bb,
0x00,
sizeof(bb));
memset(cTmp,
0x00,
sizeof(cTmp));
p
=
aa;
sscanf(p,
"%[0,1]",
cTmp);
while(NULL
!=
(p
=
strstr(p,
cTmp)))
{
sprintf(bb,
"%s%X",
bb,
strtoul(cTmp,0,2));
p
=
p
+
strlen(cTmp)
+
1;
sscanf(p,
"%[0,1]",
cTmp);
}
printf("%s",
bb);
}
大概就是这么一个思路,主要用到的就是strtoul函数。
你改成fscanf估计就好使。

㈡ c语言怎么用二进制方式读取文件

C语言中二进制文件的读取要用fread和fwrite来实现。 fwrite()与fprintf()是不同的。 fwrite将写入的数据作为文件的磁盘内容保存。fprintf将写入的数据的每个字符所对应的ASCII码作为文件的磁盘内容保存。fprintf做了一个转换的工作。

㈢ c语言用什么函数读取2进制文件内容

你怎么输出的?
二进制如果以文本输出,自然会有很多乱码。
你可以用"%x"格式输出看看
char
a;
a=fgetc(fp1);
printf("%c",
a);/*这样肯定有乱码*/
printf("%x",
a);/*这样就是16进制*/

㈣ 在c语言中如何打开二进制文件

文本文件和二进制文件就是一个声明,指明了你应该以什么方式(文本方式/二进制)打开这个文件,用什么函数读写这个文件(读写函数),怎么判断读到这个文件结尾。


具体的说:

C规定了标准输入输出函数库,用fopen()函数打开文件。fopen()函数的调用方式一般为:

FILE*fp;//定义一个文件类型的指针变量fp
fp=fopen(文件名,使用文件方式);


使用文件方式见下表:

"r"(只读) 为输入打开一个文本文件

"w"(只写) 为输出打开一个文本文件

"a"(追加) 为追加打开一个文本文件

"rb"(只读) 为输入打开一个二进制文件

"wb"(只写) 为输出打开一个二进制文件

"ab"(追加) 为追加打开一个二进制文件

"r+"(读写) 为读/写打开一个文本文件

"w+"(读写) 为读/写创建一个文本文件

"a+"(读写) 为读/写打开一个文本文件

"rb+"(读写) 为读/写打开一个二进制文件

"wb+"(读写) 为读/写创建一个二进制文件

"ab+"(读写) 为读/写打开一个二进制文件

㈤ C语言怎么读取二进制文件中的数据放到一个300×300的二维数组里面

用 fopen 打开文件时 设 "rb" --用二进制方法打开,用于读
用 fread 读取数据,函数原型是:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
各参数意义,请查编译器帮助文件,这里就不开课了。
300×300 的数组需要的内存量较大,可动态分配,或用 全局量。
下面是程序例子。先建了一个2进制文件,里面存了300*300个float型数据。然后读这个文件里的内容。
#include<stdio.h>
float a[300][300];
int main()
{
FILE *fin, *fout;
int i,j;
for (j=0;j<300;j++) for (i=0;i<300;i++) a[j][i]=j*100+i;
fout=fopen("a.txt","wb");
for (j=0;j<300;j++)
fwrite(&a[j][0],sizeof(float),300,fout);
fclose(fout);
for (j=0;j<300;j++) for (i=0;i<300;i++) a[j][i]=0; //数组清零
fin=fopen("a.txt","rb"); //打开输入文件
for (j=0;j<300;j++)
fread(&a[j][0],sizeof(float),300,fin); //读文件
fclose(fin); //关闭文件
// 下面输出文件的左上角100个数据,和右下角100个数据供检查参考。
for (j=0;j<10;j++) {
for (i=0;i<10;i++)printf("%3.0f ",a[j][i]); printf("\n");}
printf("\n");
for (j=290;j<300;j++){
for (i=290;i<300;i++)printf("%g ",a[j][i]); printf("\n");}
return 0;
}

㈥ c语言怎么二进制文件操作

主要就是二进制文件的读写、结构体的定义和使用。
fopen函数 以 "ab+" 方式打开文件,用fwrite函数写入内容; "b" 方式打开文件,读取内容;

㈦ C语言二进制文件读写是什么意思能举个例子吗

例如 int a=24
FILE *fp
fp=fopen("txt","wb");
fwrite(&a,sizeof(int),1,fp)
这样就把它用二进制 写进了文件里面
因为 你用的是二进制写,所以 把你要的写的东西都换成了二进制
然后存放在文件里面的 你用记事本打开那个文件 看到的东西是乱的 很正常 不用在意
到时候你用 rb
fread 打开 弄出来 就是24 了
PS: 我喜欢用fwrite 和 fread 因为基本什么类型的数据都以用 你也可以用其他函数 就看自己的习惯啦

㈧ 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[0] = floatToConvert[3];
returnFloat[1] = floatToConvert[2];
returnFloat[2] = floatToConvert[1];
returnFloat[3] = floatToConvert[0]; return retVal;
}struct matrix
{ int row; int column;
}s[nmemb];void set_s(int j, int x, int y)
{
s[j].row = x;
s[j].column = y;
}bool is_bigendian()
{ int a = 0x1234; char b = *(char *)&a; //b == the Low address part of a
//printf("%c ", b);
if (b == 0x34) { return false;
} return true;
}int main()
{ if (is_bigendian()) { printf("BigEndian ");
} else { printf("LittleEndian ");
}

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 ", ans); printf("size: %d ", sizeof(s)); if ((fp = fopen("test", "wb")) == NULL) { printf("EROOR "); return 1;
} for (int j = 0; j < nmemb; ++j) { printf("row: %d column: %d ", s[j].row, s[j].column);
}
fwrite(s, sizeof(struct matrix), nmemb, fp); for (int i = 0; i < nmemb; ++i) { float *m = (float*) malloc(sizeof(float) * s[i].row * s[i].column);
bzero(m, sizeof(float) * s[i].row * s[i].column); for (int j = 0; j < s[i].row; ++j) { for (int k = 0; k < s[i].column; ++k) {
m[k + j*s[i].column] = k;
}
}
fwrite(m, sizeof(float), s[i].row * s[i].column, fp); free(m);
}

fclose(fp); printf("11 "); /*
printf("%d ", sizeof(float));
FILE *fp;
if ((fp = fopen("test", "rb")) == NULL) {
printf("EROOR ");
return 1;
}
fread(s, sizeof(struct matrix), nmemb, fp);
for (int i = 0; i < nmemb; ++i) {
printf("row: %d column: %d ", s[i].row, s[i].column);
}

for (int i = 0; i < nmemb; ++i) {
float *m = (float*) malloc(sizeof(float) * s[i].row * s[i].column);
bzero(m, sizeof(float) * s[i].row * s[i].column);
fread(m, sizeof(float), s[i].row * s[i].column, fp);
for (int j = 0; j < s[i].row; ++j) {
for (int k = 0; k < s[i].column; ++k) {
printf("%lf ", m[k + j*s[i].column]);
}
printf(" ");
}
printf(" ");
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语言怎么编写一个程序读取任何二进制文件,并将文件内所有字节按相反排序存入另一文件中

如果文件不大的话,可以定义一个数组,一次性将文件内容都读出来,然后从后向前写到新文件中,如果文件很大的话,就将文件指针定位到文件结尾的前一个字节处,循环读一个字节写入另一个文件,并将原文件指针往回移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);

}

热点内容
go语言编译模式 发布:2025-01-20 19:57:25 浏览:405
超能编程 发布:2025-01-20 19:56:26 浏览:1000
安卓手机怎么连蓝牙汽车 发布:2025-01-20 19:39:05 浏览:253
保定军工存储厂家 发布:2025-01-20 19:38:53 浏览:795
云服务器ecs服务条款 发布:2025-01-20 19:19:36 浏览:47
安卓系统显示屏怎么设置屏保 发布:2025-01-20 19:18:53 浏览:896
有锁机和配置锁哪个好 发布:2025-01-20 19:18:05 浏览:767
安卓版软件如何设置 发布:2025-01-20 18:58:53 浏览:58
java中级项目案例 发布:2025-01-20 18:58:52 浏览:913
sql日志查看工具 发布:2025-01-20 18:57:12 浏览:243