當前位置:首頁 » 編程語言 » c語言二進制寫文件
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言二進制寫文件

發布時間: 2022-08-28 11:20:05

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);
數組
就不用加&了