當前位置:首頁 » 編程語言 » c語言結構體中錄入很多數據
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言結構體中錄入很多數據

發布時間: 2022-09-09 08:35:12

『壹』 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;
}

『貳』 用C語言結構體解決 「從鍵盤輸入五個用戶的數據,包括姓名和電話號碼,要求按姓名排序後,輸出用戶數據

//希望我的回答對你的學習有幫助
#include<stdio.h>
#include<string.h>

structStudent
{
charName[10]; //學生的姓名,使用字元數組存儲,長度為10
charPhoneNumber[15]; //學生的電話號,使用字元數組存儲,長度為15
}stu[5],temp; //結構體數組,長度為5,用來存放5個學生的信息
//臨時變數,用在冒泡排序的過程中交換數據

intmain()
{
for(inti=0;i<5;i++) //輸入5個學生的基本信息
{
scanf_s("%s%s",stu[i].Name,10,&stu[i].PhoneNumber,15); //輸入字元串,使用%s標記。其中每個字元串使用「空格」分開
//如果輸入的字元串包含「空格」,使用gets函數
}

for(inti=0;i<4;i++) //冒泡排序,外層循環只需要循環(長度-1)次
//因為剩下最後一個數據不需要比較
{
for(intj=0;j<4-i;j++) //第一次循環,比較的次數為(長度-1)
//每次循環的次數都在縮小
//因為每次循環之後,最值已經放在了數組的尾部
//所以在下一次循環時,就可以排除這個最值,把比較的范圍
{
if(strcmp(stu[j].Name,stu[j+1].Name)>0) //strcmp由定義得到,它就是一個根據Ascii碼,對字元串比較的函數
//如果strcmp返回0,證明兩個字元串相等
//如果strcmp返回-,證明第一個字元串比第二個字元串小
//這個小,是指在兩個字元串中第一個不相同的字元在Ascii碼表中的相對位置
//如果strcmp返回+,證明第一個字元串比第二個字元串大
//這個大,是指在兩個字元串中第一個不相同的字元在Ascii碼表中的相對位置
{
temp=stu[j]; //進行數據交換
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}

for(inti=0;i<5;i++) //輸出5個學生的基本信息
{
printf("%s%s ",stu[i].Name,stu[i].PhoneNumber);
}

getchar();getchar();

return0;
}

『叄』 C語言中利用scanf語句輸入多個值的問題

1、有一個很嚴重的錯誤,輸入字元數組的兩個

scanf("%d %s %c %c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);

scanf("%s",&person[i].category.position);

2、把這兩行中字元數組輸入時前面的&符號去掉,對字元數組輸入本身就是地址,不要加&,改成這樣

scanf("%d %s %c %c",&person[i].num,person[i].name,&person[i].sex,&person[i].job);

scanf("%s",person[i].category.position);

3、其他的也沒有什麼錯誤,記著輸入時候,那幾個值之間用一個空格隔開,用scanf()函數輸入的時候,本質是,你給scanf一個地址,這個函數會根據你輸入的地址把,輸入緩沖區中的數據放在指定地址處

4、像int ,char,double,long,float這些基本類型,再分配空間的時候,只是給他們一個空間,所以用scanf()輸入的時候,要加&取地址符號,才能給他們賦值

5、然而char *,char [],這些本身是一塊區域的首地址,本身就是地址,所以用scanf時,不用加&因此,輸入裡面不需要加的只有,person[i].name,person[i].category.position兩個,其他的都是基本類型,因此都需要加

(3)c語言結構體中錄入很多數據擴展閱讀:

優缺點

1、簡潔緊湊、靈活方便

C語言一共只有32個關鍵字,9種控制語句,程序書寫形式自由,區分大小寫。把高級語言的基本結構和語句與低級語言的實用性結合起來。C 語言可以像匯編語言一樣對位、位元組和地址進行操作,而這三者是計算機最基本的工作單元。

C語言的 Hello World 程序

2、運算符豐富

C語言的運算符包含的范圍很廣泛,共有34種運算符。C語言把括弧、賦值、強制類型轉換等都作為運算符處理。從而使C語言的運算類型極其豐富,表達式類型多樣化。靈活使用各種運算符可以實現在其它高級語言中難以實現的運算。

3、數據類型豐富

C語言的數據類型有:整型、實型、字元型、數組類型、指針類型、結構體類型、共用體類型等。能用來實現各種復雜的數據結構的運算。並引入了指針概念,使程序效率更高。

4、表達方式靈活實用

C語言提供多種運算符和表達式值的方法,對問題的表達可通過多種途徑獲得,其程序設計更主動、靈活。它語法限制不太嚴格,程序設計自由度大,如對整型量與字元型數據及邏輯型數據可以通用等。

5、允許直接訪問物理地址,對硬體進行操作

由於C語言允許直接訪問物理地址,可以直接對硬體進行操作,因此它既具有高級語言的功能,又具有低級語言的許多功能,能夠像匯編語言一樣對位(bit)、位元組和地址進行操作,而這三者是計算機最基本的工作單元,可用來寫系統軟體。

6、生成目標代碼質量高,程序執行效率高

C語言描述問題比匯編語言迅速,工作量小、可讀性好,易於調試、修改和移植,而代碼質量與匯編語言相當。C語言一般只比匯編程序生成的目標代碼效率低10%~20%。

7、可移植性好

C語言在不同機器上的C編譯程序,86%的代碼是公共的,所以C語言的編譯程序便於移植。在一個環境上用C語言編寫的程序,不改動或稍加改動,就可移植到另一個完全不同的環境中運行。

8、表達力強

C語言有豐富的數據結構和運算符。包含了各種數據結構,如整型、數組類型、指針類型和聯合類型等,用來實現各種數據結構的運算。C語言的運算符有34種,范圍很寬,靈活使用各種運算符可以實現難度極大的運算。

C語言能直接訪問硬體的物理地址,能進行位(bit)操作。兼有高級語言和低級語言的許多優點。它既可用來編寫系統軟體,又可用來開發應用軟體,已成為一種通用程序設計語言。另外C語言具有強大的圖形功能,支持多種顯示器和驅動器。且計算功能、邏輯判斷功能強大。

『肆』 c語言中如何在結構體中輸入數據,並將結構體儲存到文件之中。比方說輸入影片的信息 struct N

#include "stdio.h"
#include "stdlib.h"
struct s
{
int id;
char name[10];
int co1;
int co2;
int co3;
int co4;
};
int main()
{
int i=0,count;
struct s st[10];
char fname[10],ch;
FILE *infile,*outfile;
printf("please input data file name:\n");
scanf("%s",fname);
infile=fopen(fname,"r");
outfile=fopen("output.txt","w");
if(infile==NULL)
{
printf("\nFailed to open the file");
exit(1);
}
fscanf(infile,"%d",&count);
while(i<count)
{
fscanf(infile,"%d %s %d %d %d %d\n",&(st[i].id),st[i].name,&(st[i].co1),&(st[i].co2),&(st[i].co3),&(st[i].co4));
fprintf(outfile,"%d %s %d %d %d %d\n",st[i].id,st[i].name,st[i].co1,st[i].co2,st[i].co3,st[i].co4);
i++;
}
fclose(infile);
fclose(outfile);
}

『伍』 怎麼用C語言的scanf實現一次輸入若干個數據

這里我們先建一個固定長度的數組,如下圖,數組長度為1000

然後就需要用到循環了,並且設置一個按鍵「回車鍵」跳出循環。

這樣,不斷循環就可以不斷地將數字存進數組里。當我們按回車鍵的時候就會跳出循環,結束輸入。而輸入的數據就會保存在num數組之中,唯一的缺點就是數組長度是固定的。

(5)c語言結構體中錄入很多數據擴展閱讀:

在實際的編程中,往往會發生這種情況,即所需的內存空間取決於實際輸入的數據,而無法預先確定。對於這種問題,用靜態數組的辦法很難解決。

為了解決上述問題,C語言提供了一些內存管理函數,這些內存管理函數結合指針可以按需要動態地分配內存空間,來構建動態數組,也可把不再使用的空間回收待用,為有效地利用內存資源提供了手段。

動態數組是指在聲明時沒有確定數組大小的數組,即忽略方括弧中的下標;當要用它時,可隨時用ReDim語句(C語言中用malloc語句)重新指出數組的大小。使用動態數組的優點是可以根據用戶需要,有效利用存儲空間。

對於靜態數組,其創建非常方便,使用完也無需釋放,要引用也簡單,但是創建後無法改變其大小是其致命弱點!

對於動態數組,其創建麻煩,使用完必須由程序員自己釋放,否則嚴重會引起內存泄露。但其使用非常靈活,能根據程序需要動態分配大小。

因此,利用動態數組就可以避免靜態數組的長度不夠,內存溢出等問題,換言之,可以更靈活的存儲數組,這樣就可以根據輸入多少個數,創建多大的數組進行存儲。

『陸』 C語言中,如何將一個結構體內的信息全部輸入到一個文件中

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
structstudent
{
charname[20];
intage;
charnum[20];
}stu;
voidwrite()
{
FILE*file;
if((file=fopen("C:\123","wb"))==NULL)
{
printf("openfilefailed! ");
exit(0);
}
//stustu1;
strcpy(stu.name,"張三");
strcpy(stu.num,"09111626");
stu.age=19;
fwrite(&stu,sizeof(structstudent),1,file);
fclose(file);

}
voidread()
{
FILE*file;
if((file=fopen("C:\123","rb"))==NULL)
{
printf("openfilefailed! ");
exit(0);
}
//stustu2;
fread(&stu,sizeof(structstudent),1,file);
fclose(file);
printf("name=%s,age=%d,num=%s ",stu.name,stu.age,stu.num);
}
voidmain()
{
//write();
read();

}

『柒』 C語言中struct結構體含有很多類型數據時如何一個scanf輸入所有類型的數據

for (i=0;i<10;i++)
scanf("%d %c %f",&sch[i].num,&sch[i].name,&sch[i].score ); 就可以了。
float score,float 型輸入格式 是 %f 不是 %lf。
&sch[1].name 里的 1 改用 i.
注意,你的 name 只允許 1個字元。若多個字元 就會出錯。
如果 改為:
struct student {
int num;
char name[20]; // 用字元串,而不是單個字元
float score;
} sch[10];
輸入格式 name 用 %s, 參數 sch[i].name,沒有 &號:
for (i=0;i<10;i++)
scanf("%d %s %f",&sch[i].num, sch[i].name,&sch[i].score );

『捌』 C語言中,將多個結構體數據寫到一個文件中,應該如何讀取

C語言把一個結構體數組寫入文件分三步:
1、以二進制寫方式(wb)打開文件
2、調用寫入函數fwrite()將結構體數據寫入文件
3、關閉文件指針

相應的,讀文件也要與之匹配:
1、以二進制讀方式(rb)打開文件
2、調用讀文件函數fread()讀取文件中的數據到結構體變數
3、關閉文件指針

參考代碼如下:

#include<stdio.h>
structstu{
charname[30];
intage;
doublescore;
};
intread_file();
intwrite_file();
intmain()
{
if(write_file()<0)//將結構體數據寫入文件
return-1;
read_file();//讀文件,並顯示數據
return0;
}
intwrite_file()
{
FILE*fp=NULL;
structstustudent={"zhangsan",18,99.5};
fp=fopen("stu.dat","wb");//b表示以二進制方式打開文件
if(fp==NULL)//打開文件失敗,返回錯誤信息
{
printf("openfileforwriteerror ");
return-1;
}
fwrite(&student,sizeof(structstu),1,fp);//向文件中寫入數據
fclose(fp);//關閉文件
return0;
}
intread_file()
{
FILE*fp=NULL;
structstustudent;
fp=fopen("stu.dat","rb");//b表示以二進制方式打開文件
if(fp==NULL)//打開文件失敗,返回錯誤信息
{
printf("openfileforreaderror ");
return-1;
}
fread(&student,sizeof(structstu),1,fp);//讀文件中數據到結構體
printf("name="%s"age=%dscore=%.2lf ",student.name,student.age,student.score);//顯示結構體中的數據
fclose(fp);//關閉文件
return0;
}