當前位置:首頁 » 編程語言 » 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);

}

熱點內容
安卓模擬大自然怎麼玩 發布:2025-01-20 22:46:55 瀏覽:361
科密加密卡片 發布:2025-01-20 22:45:01 瀏覽:111
蘋果的文件怎麼轉到安卓 發布:2025-01-20 22:43:10 瀏覽:652
c語言迴文串 發布:2025-01-20 22:43:09 瀏覽:767
垃圾壓縮價格 發布:2025-01-20 22:14:05 瀏覽:421
溫十系統如何看處理器配置 發布:2025-01-20 21:59:47 瀏覽:302
米號源碼 發布:2025-01-20 21:55:30 瀏覽:893
電信四川dns伺服器ip 發布:2025-01-20 21:54:51 瀏覽:92
電腦彈出腳本錯誤還能繼續使用嗎 發布:2025-01-20 21:42:29 瀏覽:586
安卓私密照片在哪裡 發布:2025-01-20 21:41:05 瀏覽:5