① c语言 二进制写文件
呃,我猜你是交大的?
现在你应该已经知道了吧。那我在说一遍,看在同学的份上送我一个fb吧:)
将25储存在一个int型变量中,比如ID = 25,然后用那个宏函数MC_GET_LONG(&ID),其实就相当于读取的逆过程,然后用fwite(&ID,4,1,fp)输出就好啦~
② C语言二进制流写入文件
我提个思路。字节是计算机操作的实际最基本单位,任何地址只能精确到字节而无法精确到位的。
所以LZ一定要将位整合到以字节为单位才能进行其他操作。可以这么做,将二进制流按照每8位一个单位装成一个字节,并明确好字节之间的顺序,字节内高低位的顺序,最后末尾不足的要塞一些没意义的但LZ要知道的位凑足成字节。这里面当然必须反复用到位运算。
通常的做法是字节之间的顺序按照自然字节地址由小到大顺序,字节内低位在前。比如对于已经整合成字节的字节流a[N],查看第 i 个位(从0起)的算法是 a[i/8] & (1<<(i%8))。
不同的位序约定会稍有不同位操作
③ C语言二进制文件读写是什么意思能举个例子吗
例如 int a=24
FILE *fp
fp=fopen("txt","wb");
fwrite(&a,sizeof(int),1,fp)
这样就把它用二进制 写进了文件里面
因为 你用的是二进制写,所以 把你要的写的东西都换成了二进制
然后存放在文件里面的 你用记事本打开那个文件 看到的东西是乱的 很正常 不用在意
到时候你用 rb
fread 打开 弄出来 就是24 了
PS: 我喜欢用fwrite 和 fread 因为基本什么类型的数据都以用 你也可以用其他函数 就看自己的习惯啦
④ C语言读写二进制文本文件(.txt),如果可行,加200分,先谢过
假定你用MS VC++ 6.0 编译器,不是TC.
假定 第1、2、3、4字节表示分数, 是 int 型
文件名 abc.txt
如果还没有2进制文件,则可以自己建1个,假定数据为:
// int mark[1000]={60,70,80,95,30};
// char m[1000][25]={"zhang","wang","Li","Zhao","Fang"};
打开写入:
// fin=fopen(namein,"wb+");
// for (i=0;i<n;i++) { fwrite(&mark[i],4,1,fin);fwrite(m[i],25,1,fin);}
// fclose(fin);
再运行。
下面没有使用“结构”,分数存 mark[], 人名存 m[][25].
#include <stdio.h>
int main() {
FILE *fin;
char namein[80]="abc.txt";
int mark[1000],t;
char m[1000][25],ts[25];
int i,j,n=0;
fin=fopen(namein,"rb+");
if (!fin){
printf("open %s error\n",namein);
}
while(1){
fread(&mark[n],4,1,fin);
if (feof(fin)) break;
fread(&m[n],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[i],m[i]);
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++){
if (mark[j]>mark[i]){
t = mark[i];mark[i]=mark[j];mark[j]=t;
strcpy(ts,m[i]); strcpy(m[i],m[j]);strcpy(m[j],ts);
}
}
rewind(fin);
for (i=0;i<n;i++)
{ fwrite(&mark[i],4,1,fin);fwrite(m[i],25,1,fin);}
fclose(fin);
return 0;
}
⑤ c语言如何创建二进制文件
在windows系统下,C语言打开文件的"文本文件"方式和"二进制文件方式"的区别是:
在文本文件模式下:当给文件写入'\n'时,实际会写入'\r''\n',读文件时如果读到\r\n,会丢弃\r只保留\n, 除此以外,和二进制方式没有任何区别
举例:
FILE* fp;
fp = fopen("123", "w");
fputc(10,fp); //10就是\n 但实际上会对文件写入\r\n,你用16进制编辑器打开123,会看到0D0A 两个字符
fclose(fp);
甚至这样:
fp = fopen("123", "w");
int n = 1116682; //这是16进制的0x110A0A
fwrite(&n, 4, 1, fp); //因为那数字字节里有0A,写入时会挤进去0D实际写入0D0A0D0A1100
fclose(fp);
而这样就只写入0A
fp = fopen("123", "wb");
fputc(10,fp); //只写入0A
至于你看到的"仍是文本文件",是因为你对文件写入的内容就是些文本而已
所有文件都是二进制的,文本文件只是文件的内容都是些ASCII或者unicode等可读的字符而已
⑥ c语言怎么二进制文件操作
主要就是二进制文件的读写、结构体的定义和使用。
fopen函数 以 "ab+" 方式打开文件,用fwrite函数写入内容; "b" 方式打开文件,读取内容;
⑦ 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语言大神:如何写二进制文件,怎样使文件大小不变
rewind函数只是把文件内部指针指向开头了啊,并没有清空文件内容,你在原512基础上又给循环进去5个就变成517了啊,
函数名称:写字符文件函数fputc()
函数功能:将字符ch写到文件指针fp所指向的文件的当前写指针的位置。
函数格式:intfputc(intn,File*fp)
参数解释:fp为文件指针,它的值是执行fopen()打开文件时获得的。
而ab打开方式是以2进制方式打开,追加到文件尾,也就是说你fopen返回的文件指针是指向文件尾部的
⑨ 如何通过c语言创建编写二进制文件
所有文件都可以看成二进
制型的
用f1=fopen("bbb.txt","wb");
来创
建,和"w"区别
在于
打印"\n"时
"w"是2字节
,0x0d
0x0a
而"wb"是1字节
,
0x0a
二进
制数据这
样
写入
比如是个int
a;
fwrite(&a,sizeof(int),1,f1);
数组
就不用加&了