C语言编写读取3个二进制文件合成一个

作者&投稿:连卖 (若有异议请与网页底部的电邮联系)
用C语言编写二进制转换十进制的程序。~

1、为了完成进制的转换,在主函数中声明了个函数Sum,主要用于将二进制的每一位转换为十进制后的数相加,返回值就是相加后的和。另外定义了一个数组array[8],用于存放输入的八位二进制数。

2、然后使用了一个for循环语句,用于输入八位二进制数。在scanf函数里,在%d之间加了一个1,即%1d,这样是好连续的输入八个数,如果没有中间的1,则编译器会认为你只输入了一个数,即那个八位数。然后使用printf函数输出,并且调用Sum函数,数组名作为实参。

3、在Sum函数中,又声明了一个power函数,power函数的作用是求2的n次方,其实这里可以调用库函数pow,但是老师要求不调用库函数,因此就自己写了一个求2的n次方的函数,在这里n为指数,term为每一位数转换为十进制后的的数,如1*(2*2),sum为总和。

4、接着,使用了一个for循环语句,i用于控制循环的次数,n从最高的指数7开始每次循环减一,如果指数大于或等于零的,就进行循环,因为二进制的最后一位转换为十进制数时指数就是零,此后循环就结束。调用power函数时,将n作为实参,最后将和返回,即将sum作为返回值返回给Sum函数。

5、在power函数中,如果b等于零,即指数为零,则返回1,否则就进入一个循环,j用于控制循环次数,有疑问的可以用笔算算乘2的个数对不对,最后将i返回。


6、最后看一下运行的结果。

如果文件不大的话,可以定义一个数组,一次性将文件内容都读出来,然后从后向前写到新文件中,如果文件很大的话,就将文件指针定位到文件结尾的前一个字节处,循环读一个字节写入另一个文件,并将原文件指针往回移2个字节,直到将所有字节反向读取完成并写入。
#include

main()
{
char c;

FILE *rfp, *wfp;

rfp = fopen("a.bin", "rb"); // 文件名自己指定
if(rfp == NULL) {
printf("文件不存在
");

return -2;

}

wfp = fopen("b.bin", "wb");

if(wfp == NULL) {
printf("无法创建文件
");

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);

}

[08:03:21@~/c-cpp]$ cat a.c
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char*argv[])
{
if (argc != 4)
return -1;
#define N 3
FILE *in1, *in2, *in3;

if ((in1 = fopen(argv[1], "rb")) != NULL)
if ((in2 = fopen(argv[2], "rb")) != NULL)
if ((in3 = fopen(argv[3], "rb")) != NULL)
printf("Open files OK.\n");
else
fclose(in2), fclose(in1);
else
fclose(in1);

for (int i = 0; i < 3; i++) { // 3 output files
char buf[N][3], fname[3];
sprintf(fname, "%d", i);
FILE *out = fopen(fname, "wb");
fread(buf[0], N, 1, in1); // omit return value
fread(buf[1], N, 1, in2);
fread(buf[2], N, 1, in3);
fwrite(buf, N*3, 1, out);
fclose(out);
}

return 0;
}
[08:03:26@~/c-cpp]$ gcc a.c --std=c99
[08:03:33@~/c-cpp]$ ls -l
总用量 24
-rw-r--r-- 1 jgx jgx 674 2009-06-20 08:02 a.c
-rwxr-xr-x 1 jgx jgx 9222 2009-06-20 08:03 a.out
-rw-r--r-- 1 jgx jgx 1147 2009-06-18 00:30 dbf.cpp
-rw-r--r-- 1 jgx jgx 641 2009-06-17 23:44 dbf.o
[08:04:28@~/c-cpp]$ ./a.out a.c a.out dbf.o
Open files OK.
[08:04:59@~/c-cpp]$ ls -l
总用量 36
-rw-r--r-- 1 jgx jgx 9 2009-06-20 08:04 0
-rw-r--r-- 1 jgx jgx 9 2009-06-20 08:04 1
-rw-r--r-- 1 jgx jgx 9 2009-06-20 08:04 2
-rw-r--r-- 1 jgx jgx 674 2009-06-20 08:02 a.c
-rwxr-xr-x 1 jgx jgx 9222 2009-06-20 08:03 a.out
-rw-r--r-- 1 jgx jgx 1147 2009-06-18 00:30 dbf.cpp
-rw-r--r-- 1 jgx jgx 641 2009-06-17 23:44 dbf.o
[08:05:03@~/c-cpp]$

首先你最好搞清楚字节(byte)和位(bit)的区别
1 byte = 8 bit
比特是bit的音译
UE默认按字节显示 也就是说那个00实际上有8个比特“00000000” 而14实际上是“00010100”
貌似ANSI C里没有以位为单位进行读写的函数(最小单位是字节)
所以推荐你把那三个文件全部读入缓存中
然后再进行处理

以前用C做哈夫曼压缩的程序时就遇到过位操作的问题
当时导师告诉我说可以对位二进制序列进行二次扫描
第一次文件中存放的是字符串“00010100”
二次扫描时就可以将这8个字符转换为ASCII码为20的字符 达到压缩目的

具体到你说的这个3位3位操作的 思路类似 希望你独立思考 :)

百度知道 > 电脑/网络 > 程序设计 > C/C++添加到搜藏待解决
C语言编写读取3个二进制文件合成一个
悬赏分:100 - 离问题结束还有 14 天 20 小时
现在要在linux下用C写一个小程序,读取三个文件,文件名要以外部参数形式给,就是用argv*[]给,
依次从三个文件中各读3个比特,共9个比特放到新文件中,再依次读3个这样反复到文件结束,三个文件大小完全相同.
希望有人能大体给我写写,或者把关键点给我写出来,wibdows下编译的也没事,我自己会改
我现在比较不明白的是3个比特怎么读,我把文件放到UE里去看了,是类似于00 0F 14 FF....这样的,三个比特就是00 0F 14这样算3个了吗?

looker_on


c语言初学者:编写程序,读入三个双精度数,求它们的平均值并保留此平均...
&x,&y,&z); ave=(x+y+z)%3.0; i=ave*100; i=i%10;\/\/得到小数点百分位上的数 j=ave*10; if(i>=5){ j+=1; ave=(double

如何通过c语言编程输出三个数的排序?
C语言程序如下:include<stdio.h> intmain(){ inta,b,c,t;printf("请输入三个数:");scanf("%d%d%d",&a,&b,&c);if(a>b){ t=a;a=b;b=t;} if(a>c){ t=a;a=c;c=t;} if(b>c){ t=b;b=c;c=t;} printf("从小到大的顺序是:%d %d %d\\n",a,b,c);return0;} ...

C语言问题:将3个二进制位变为7个二进制位
{fread(data333,3,1000,in);\/*假设为1000,本打算是N的,不会写*\/ } 这里,后面的大括号不应该扩在这里,应该在fwrite(&data7,7,1,out); 后面。

c语言中,一个八进制位=3个2进制位没错对吧,那么我给你一个八进制数"1...
因为这个八进制数的第一位是1,转成二进制是001,它只占1位,而不是你理解的3位。如果把第一位换成2-7,就会出现你说的越位了。因为int型第一位是符号位,表示数的正负,不表示值。

用c语言编写程序,输入3个整数,求三个数中的最大值
include<stdio.h> void main(){ int a,b,c;scanf("%d",&a);scanf("%d",&b);scanf("%d",&c);if(a>=b&&a>=c)printf("%d",a);else if(b>=c)printf("%d",b);else printf("%d",c);}

用c语言编写程序计算3个数中最大值
程序如下:include <stdio.h> int main(){ int a,b,c,Max;printf("请输入3个数:\\n");scanf("%d%d%d",&a,&b,&c);Max=a>b?(a>c?a:c):(b>c?b:c);printf("3个数中最大值为:%d\\n",Max);return 0;}

C语言,一个八进制数可以代表3个二进制数怎么理解?
因为2的3次方等于8,也就是说,任意一个小于8的数都可以用3个二进制数表示了,所以1个八进制数可以用3个二进制数表示.

编写C语言程序,输入a b c 3个值,输出其中最大值
(1)取3个数中的任意2个数比较,将大的那个数赋给max;(2)让剩下的那个数和上一步赋给的最大值比较,将较大的数赋值给max;(3)输出最大值。具体程序如下:include <stdio.h>int main(void){ int a,b,c;scanf("%d %d %d",&a,&b,&c); \/\/ 输入3个数int max = a; \/\/...

用C语言编写 求出1-100之间能被3和2整除的数及个数
include<stdio.h> void main(){ int i,n=0;printf("1-100之间能同时被3和2整除的数为:");for(i=1;i<=100;i++){ if(i%2==0&&i%3==0 ){ printf("%d\\n",i);n++;} } printf("符合要求的数的总共的个数为:%d\\n",n);}\/\/能够运行的,呵呵,自己试试!!

C语言利用指针编写函数,输入3个学生2门课成绩,计算每个学生的平均分和...
a=(a1+a2)\/2;b=(b1+b2)\/2;c=(c1+c2)\/2;printf("a学生的平均成绩是:\\n");printf("%d\\n",a);printf("b学生的平均成绩是:\\n");printf("%d\\n",b);printf("c学生的平均成绩是:\\n");printf("%d\\n",c);int a_c,a_c1;a_c=(a1+b1+c1)\/3;a_c1=(a2+b2+c2)\/3;pri...

岢岚县18889551507: C语言编写读取3个二进制文件合成一个 -
相刘阿西: [08:03:21@~/c-cpp]$ cat a.c #include<stdio.h> #include<stdlib.h> int main(int argc, char*argv[]) {if (argc != 4)return -1; #define N 3FILE *in1, *in2, *in3; if ((in1 = fopen(argv[1], "rb")) != NULL)if ((in2 = fopen(argv[2], "rb")) != NULL)if ((in3 ...

岢岚县18889551507: C语言二进制文件合并操作,无法实现… -
相刘阿西: 循环体错误,差括号 修改如下: while(!feof(fp1)|| !feof(fp2) ) if (!feof(fp1)) {ch1=fgetc(fp1);fputc(ch1,fp3);} if (!feof(fp2)) { ch2=fgetc(fp2); fputc(ch2,fp3); } }

岢岚县18889551507: c语言怎么从两个文件中读取数据,然后整合到一个文件中 -
相刘阿西: fopen那两个文件(1和2),然后先读1到新文件3中,关闭1;然后在读2到新文件中,关闭2,最后关闭3

岢岚县18889551507: C语言 将多个文本文件合成到一个文件中 -
相刘阿西: 你只能全用 unicode.ANSI转Unicode,空白以后的码,前面加一个0x00,组成两字节码. 空白以前的码,要查一下编码.(我只记得回车是0x2029; 新行是0x2028;其它码你转空白0x0020也可以).注意notepad写成的Unicode文件开始处有不可见特别码,所以输出文件头要先写这个特别码.特别码的值与unicode 大端码或小端码有关.小端码0xfffe, 大端码 0xfeff.Unicode文件要用 二进制文件 打开 读写.

岢岚县18889551507: c语言读二进制文件 -
相刘阿西: #include <stdio.h> main( ) { FILE *fp; float data[6]; int i;/*打开文件*/ fp=fopen("yibin","rb"); if(fp==null) exit(0); /*从文件中读6个浮点到缓冲区data中*/ fread(data,sizeof(float),6); /*显示缓冲区的内容*/ for(i=0;i<6;i++) printf("%f\n",data[i]); return 0; }

岢岚县18889551507: c语言读取二进制数据文件 -
相刘阿西: 1、二进制文本使用fopen函数的二进制模式“rb”就可以打开.对于程序来说,不管后缀名如何,文件分为两种类型:文本文件和二进制文件. C语言里有一系列文件操作函数.区分文本和二进制文件,需要在打开文件时设置不同的控制符...

岢岚县18889551507: C语言链表读取二进制文件 -
相刘阿西: 关键代码应该是这样的 FILE *fp = fopen("file","rb"); char *p = node->data; while(!feof(fp))*p++ = fgetc(fp); fclose(fp);//**********************以上读******************* FILE *fp = fopen("file","wb"); char *p = node->data; while( p < node->data+len) fputc(fp,*p++); fclose(fp);//**********************以上写*******************

岢岚县18889551507: C语言编写一个程序:读取任何二进制文件,并将文件内所有字节按相反排序存入另一文件中 -
相刘阿西: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37#include <stdio.h> #define FILE_NAME "E:/2.bin"// 读取的文件名 #define NEW_FILE_NAME "E:/2$.bin"// 新文件名 intmain() { ...

岢岚县18889551507: C语言2个文件合并为3个 -
相刘阿西: 将两个文件内容合并,文件操作:123456789101112131415161718192021222324252627282930 #include <stdio.h>#include <stdlib.h> intmain(intargc, char*argv[]) { FILE*fp1, *fp2, *fp3; intch; fp1 = fopen("data1", "r"); fp2 = fopen("data2...

岢岚县18889551507: c语言如何读写二进制 -
相刘阿西: 详细:http://hi.baidu.com/gibbon_ho/blog/item/9ca853e68447c42bb9382086.html我一直觉得二进制文件读写是个很容易的事,所以一直没在意,最近在写一个http客户端,实现文件下载的时候,发现总有问题,后来才发现是忘记写文件用二进...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网