當前位置:首頁 » 編程語言 » C語言把結構體寫入文件

C語言把結構體寫入文件

發布時間: 2022-04-02 08:39:26

A. c語言怎麼把結構體數組寫入txt文件

fopen("student.txt","wb")
b就是二進制的意思。你用二進制形式將student.txt打開
而fwrite也是將內存中的數據不經轉換直接寫入文件,所以文件中保存的是二進制形式,當然看到亂碼了。

你試試:
if((fp1=fopen("student.txt","w"))==NULL)
{printf("cannot open this file\n");
exit(0);
}
printf("No Name Eng point Math point Phy point\n");
for(i=0;i<N;i++)
{scanf("%s,%s,%d,%f,%d,%f,%d,%f",student[i].no,student[i].name,&student[i].eng,&student[i].point1,
&student[i].math,&student[i].point2,&student[i].phy,&student[i].point3);
student[i].ave=(student[i].eng+student[i].math+student[i].phy)/3.0;
fprintf(fp1,"%s,%s,%d,%f,%d,%f,%d,%f",student[i].no,student[i].name,student[i].eng,student[i].point1,
student[i].math,student[i].point2,student[i].phy,student[i].point3);
}

就是用fprintf函數寫入文件,你試試看吧。

B. c語言將結構體寫入文件

誰說fwrite只能寫入整形的
fwrite((void*)&variable, 1, sizeof(float), fp);
寫結構體入文件時要格外注意對齊格式,最好可以單元素寫,單元素讀。整個結構體寫入的話,如果讀出程序對齊格式與寫入程序不同,那讀出來的數據一定是錯的。

C. C語言中如何將已有結構體數據寫入一個文件

用塊寫入 一次性把結構體的數據寫入文件
fwrite

D. C語言結構體的文件寫入問題

第一個問題:
void save(struct classdata *head)
函數的返回類型定義為void,建議修改為int或其他類型,總之應有返回值,因為函數的調用者是關心該函數的運行結果的。

第二個問題:
if((text=fopen(data,"wb+"))==NULL)
{printf("文件打開失敗\n");
//通常這里需要返回,因為fopen操作已經失敗了,後面的操作無法正確執行,應該向函數調用者返回一個錯誤值。不過你的這個函數聲明為void類型,無法返回值,會影響到對程序的控制(因為函數的調用者不知道調用後函數的執行結果是正常結束的還是異常結束的)。
}

第三個問題:
while(head!=NULL)
{
if(fwrite(head,sizeof(struct classdata),1,text)!=1); //這一行最後的分號應刪除
//這里;應該加一個左花括弧
printf("數據寫入失敗\n");
// 這里應該加一個右花括弧
head=head->transverse;
}
修改後
while(head!=NULL)
{
if(fwrite(head,sizeof(struct classdata),1,text)!=1)
{
printf("數據寫入失敗\n");
//注1:這里應返回一個錯誤值
}
head=head->transverse;
}

注1:這里有與問題二同樣的情況,沒有對可能出現的異常情況進行判斷和處理,所以,即使發生異常,循環仍會繼續進行直到最後一條記錄(當fwrite出現一次異常,通常之後的操作也不會正常完成),如你的代碼,就會反復輸出"數據寫入失敗"字樣。
對於你的應用程序來說,可能沒有太多條記錄(學生數再多也就是百或者千數量級的),所以表面上可能看不出來有什麼影響。在實際的軟體工程項目中,操作的如果是以百萬或千萬數量級的記錄數(如資料庫),效率上就會有很大的差別。建議養成良好的習慣,對可能出現的異常要進行判斷和處理。
實際上,一個函數的代碼中,真正完成函數功能的代碼可能很少,但用於異常情況的判斷和處理的代碼可能會是實現函數功能代碼的N多倍,這樣才可以作出堅固、穩定的程序。

綜上,個人給出建議的代碼:
int save(struct classdata *head)
{
FILE *text;
char data[255]; //這里有改動,文件名字元串長度建議長一些
printf("請輸入你要建立的文本名字:");
scanf("%s",data);
if((text=fopen(data,"wb+"))==NULL)
{
printf("文件打開失敗\n");
return -1;
}
while(head!=NULL)
{
if(fwrite(head,sizeof(struct classdata),1,text)!=1)
{
printf("數據寫入失敗\n");
return -2;
}
head=head->transverse;
}
return 0;
}

E. C語言 怎麼把結構體寫入文件

你把結構體轉成字元數組或者字元串 保存就行

F. C語言關於結構體寫入文件的求助

如果想文件是可讀的,可以用fprintf,用法和printf類似,一行一個結構體就好了,讀的時候用fscanf
如果追求簡單,那麼fwrite整體二進制寫入就行,讀的時候用fread

G. c語言 怎麼將結構體寫入文件

最好用2進制方法打開文件,用fwrite 寫文件。讀時也用用2進制方法打開文件,用fread讀.
這樣,寫的時候按整個結構寫,讀也按整個結構讀,字元串有空白也沒關系。
FILE *fp;

fp=fopen("my.dat","wb");
fwrite(&stu,sizeof(stu),1,fp); // 寫1個結構
for (i=0;i<10;i++) fwrite(&student[i],sizeof(student),1,fp); // 寫10個結構
fclose(fp);

fp=fopen("my.dat","rb");
fread(&stu,sizeof(stu),1,fp); // 讀1個結構
for (i=0;i<10;i++) fread(&student[i],sizeof(student),1,fp); // 讀 10個結構
fclose(fp);

H. C語言怎麼把結構體寫入文件

一般有兩種方法.

structA
{
inta;
floatf;
chars[10];
}m;

為例:

一種是寫文本文件

以"w"打開

fprintf(fp,"%d%f%s
",m.a,m.f,m.s);

另一種是寫二進制文件.

以"wb"打開

fwrite(&m,sizeof(m),1,fp);

I. C語言 把結構體中的數據寫入文件的問題

//根據樓主給出的結構體structstudent以及函數wirte(),稍作修改.
//假設每個學生選修的課程數目不一定相同,課程名稱也不一定相同.
//以下是修改後的測試代碼.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedefstructstudent
{
//原代碼charke[20];
charke[20][15];//可存放20個課程名稱,每個名稱長度最大14
charxuehao[15];//學號(學號也可以用int整數型,或者long型)
charname[15];//姓名
intchengji[21];//chengji[20]用於保存總成績
intkeQty;//實際選修了多少個課程
floataverage;//平均分
}AO;

AOxx[50];

//輸入數據
inttestInput()
{
intn;//實際輸入多少個學生
intm;//選修多少個課程
inti;

n=3;

strcpy(xx[0].xuehao,"1001");
strcpy(xx[0].name,"張一");
xx[0].keQty=1;
strcpy(xx[0].ke[0],"math");
xx[0].chengji[0]=90;
m=xx[0].keQty;
for(i=0;i<m;i++)
{
xx[0].chengji[20]+=xx[0].chengji[i];
}
xx[0].average=1.0*xx[0].chengji[20]/m;

strcpy(xx[1].xuehao,"1002");
strcpy(xx[1].name,"李二");
xx[1].keQty=3;
strcpy(xx[1].ke[0],"math");
strcpy(xx[1].ke[1],"english");
strcpy(xx[1].ke[2],"C");
xx[1].chengji[0]=81;
xx[1].chengji[1]=82;
xx[1].chengji[2]=87;
m=xx[1].keQty;
for(i=0;i<m;i++)
{
xx[1].chengji[20]+=xx[1].chengji[i];
}
xx[1].average=1.0*xx[1].chengji[20]/m;

strcpy(xx[2].xuehao,"1003");
strcpy(xx[2].name,"王三");
xx[2].keQty=2;
strcpy(xx[2].ke[0],"math");
strcpy(xx[2].ke[1],"english");
xx[2].chengji[0]=85;
xx[2].chengji[1]=86;
m=xx[2].keQty;
for(i=0;i<m;i++)
{
xx[2].chengji[20]+=xx[2].chengji[i];
}
xx[2].average=1.0*xx[2].chengji[20]/m;

printf(" 錄入成功. ");

returnn;
}
//寫入文件
voidwriteFile(AOdata[],intn)
{
FILE*fp;
inti;
intret;

fp=fopen("save.txt","w");
if(fp==NULL)
{
printf(" 打開文件錯誤. ");
exit(1);
}

for(i=0;i<n;i++)//將記錄逐條寫入文件
{
ret=fwrite(&data[i],sizeof(AO),1,fp);
if(ret!=1)
{
printf(" 寫入文件時出現錯誤. ");
break;
}
}
fclose(fp);
printf(" 寫入文件save.txt結束. ");
}
//讀取文件
voidreadFile()
{
AOtestData[50];//臨時的結構體數組,只用於測試
FILE*fp;
intn;
intm;
inti,j;
intret;

fp=fopen("save.txt","r");
if(fp==NULL)
{
printf(" 打開文件錯誤. ");
exit(1);
}

n=0;
//函數feof(),檢測是否遇到文件結束符,
//如果文件結束,則返回非1值,否則返回0
while(!feof(fp))
{
ret=fread(&testData[n],sizeof(AO),1,fp);
if(ret==1)
{
n++;
}
}
fclose(fp);//關閉文件

printf(" 讀取文件結束,得到%d條記錄. ",n);
for(i=0;i<n;i++)
{
printf("第%d個學生 ",i+1);
printf("學號:%s ",testData[i].xuehao);
printf("姓名:%s ",testData[i].name);
m=testData[i].keQty;
printf("選修%d個課程 ",m);
for(j=0;j<m;j++)
{
printf("%s:%d ",testData[i].ke[j],testData[i].chengji[j]);
}
printf("總成績:%d ",testData[i].chengji[20]);
printf("平均分:%0.1f ",testData[i].average);
printf(" ");
}
}

intmain(void)
{
intn;

n=testInput();//輸入數據

writeFile(xx,n);//寫入文件

readFile();//讀取文件

return0;
}

J. C語言中可否將整個結構體寫入文件,然後取出來也是按結構體輸出

可以,寫的時候用指針一次性寫進去,但是如果文件中寫如了多個結構體你可能讀取的時候要區分一下否則一次全部讀出來了,讀出來的時候直接賦值就行。

熱點內容
師資配置含哪些內容 發布:2025-01-18 07:17:35 瀏覽:706
江西腳本 發布:2025-01-18 07:14:38 瀏覽:392
php中i方法 發布:2025-01-18 07:13:19 瀏覽:369
FTP寶塔Linux面板 發布:2025-01-18 07:10:05 瀏覽:395
無線網卡怎麼改密碼 發布:2025-01-18 06:54:41 瀏覽:765
ava動態編譯 發布:2025-01-18 06:54:39 瀏覽:765
中國學位論文全文資料庫 發布:2025-01-18 06:43:49 瀏覽:688
全局變數存儲類別 發布:2025-01-18 06:39:29 瀏覽:423
蘋果平板的王者號如何轉移到安卓 發布:2025-01-18 06:37:11 瀏覽:611
圖片訪問量 發布:2025-01-18 06:36:34 瀏覽:497