C語言程序設計-第十章 學生信息的讀取與保存_第1頁
C語言程序設計-第十章 學生信息的讀取與保存_第2頁
C語言程序設計-第十章 學生信息的讀取與保存_第3頁
C語言程序設計-第十章 學生信息的讀取與保存_第4頁
C語言程序設計-第十章 學生信息的讀取與保存_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

項目十學生信息的讀取與保存-文件1【項目要求】從文件a.txt讀取某班的期末考試成績,按總分排序后寫入另外一個文件b.txt。

在上一章實現的項目中發(fā)現,每次運行程序都要輸入大量的數據,如果用我們以前學過的輸入的方法就很不方便,最常用的方法就是預先將這些數據寫到一個文件里,再將這個文件存放在磁盤上,需要時再將數據從該文件中讀取。為實現本項目需要經過打開文件、從文件進行數據的讀/寫、關閉文件指針三步。

【項目分析】2問題情境及實現

#include<stdio.h>#defineN100typedef

structstudent{charnum[11];charname[9];intscore[3];floatavr;}STU;voidfsort(STU

s[],intn)//對結構體數組中的n個數據進行簡單選擇排序{

int

i,j,k; STUt;

for(i=0;i<n-1;i++) {k=i;

for(j=i+1;j<n;j++)

if(s[k].avr<s[j].avr)k=j;

if(i!=k){t=s[i];s[i]=s[k];s[k]=t;}}}3問題情境及實現

voidmain(){FILE*fp1,*fp2;STUs[N];int

i,n,j,sum;if((fp1=fopen("f:\\cresource\\10w2.txt","r"))==NULL){

printf("找不到該文件\n");/*如果打不開文件則給出相應的提示*/

getch();exit(0);}i=0;while(!feof(fp1))/*從文件中讀取有關數據,一直讀到文件末尾*/{ fscanf(fp1,"%s%s",s[i].num,s[i].name);

sum=0;

for(j=0;j<3;j++) { fscanf(fp1,"%d",&s[i].score[j]); sum+=s[i].score[j]; }

s[i].avr=sum/3.0;/*同時求出平均分*/ i++;}4問題情境及實現

fclose(fp1);/*關閉文件*/n=i;for(i=0;i<n;i++){

printf("\n第%d個學生的信息:%s%s",i+1,s[i].num,s[i].name);

for(j=0;j<3;j++)

printf("%d",s[i].score[j]);}fsort(s,n);fp2=fopen("f:\\cresource\\10w2_2.txt","w");/*打開文件進行保存數據*/for(i=0;i<n;i++){ fprintf(fp2,"%s%s",s[i].num,s[i].name);

for(j=0;j<3;j++) fprintf(fp2,"%d",s[i].score[j]); fprintf(fp2,"%f",s[i].avr); fprintf(fp2,"\n");/*寫完一個學生的信息換行*/}fclose(fp2);}566相關知識2.文件的打開與關閉本講小結1.文件概述3.文件的讀寫操作重點:文件的打開與關閉文件的讀寫操作4.文件應用舉例1文件概述(1)1.1使用文件的目的①程序與數據分離:

數據文件的改動不引起程序的改動;②數據共享:

不同程序可以訪問同一數據文件中的數據;③能長期保存程序運行的中間數據或結果數據。71文件概述(2)1.2文件的分類按文件的邏輯結構:記錄文件:由具有一定結構的記錄組成(定長和不定長)流式文件:由一個個字符(字節(jié))數據順序組成按存儲介質:普通文件:存儲介質文件(磁盤、磁帶等)設備文件:非存儲介質(鍵盤、顯示器、打印機等)81文件概述(3)1.2文件的分類(續(xù))按數據的組織形式:文本文件:ASCII文件,每個字節(jié)存放一個字符的ASCII碼二進制文件:數據按其在內存中的存儲形式原樣存放9存儲為二進制文件形式:00010000001001111文件概述(4)1.2文件的分類—文本文件和二進制文件0010011100010000存儲為文本文件形式:0011000000110000001100000011000000110001如:int型數10000內存存儲形式文本文件特點:存儲量大、速度慢、便于對字符操作二進制文件特點:存儲量小、速度快、便于存放中間結果101文件概述(5)1.3文件處理的方法緩沖文件系統:高級文件系統,系統自動為正在使用的文件開辟內存緩沖區(qū),利用緩沖區(qū)完成文件讀寫操作。非緩沖文件系統:低級文件系統,由用戶在程序中為每個文件設定緩沖區(qū)111文件概述(6)1.3文件處理的方法—緩沖文件系統輸出文件緩沖區(qū)輸入文件緩沖區(qū)程序數據區(qū)緩沖文件系統:磁盤文件寫入文件讀取文件121文件概述(7)1.3文件處理的方法—非緩沖文件系統程序緩沖區(qū)指令區(qū)用戶數據區(qū)非緩沖文件系統:磁盤文件讀寫文件131文件概述(8)1.4文件類型指針—文件結構體typedef

struct{shortlevel;/*fill/emptylevelofbuffer*/unsignedflags;/*Filestatusflags*/charfd;/*Filedescriptor*/unsignedcharhold;/*Ungetccharifnobuffer*/shortbsize;/*Buffersize*/unsignedchar*buffer;/*Datatransferbuffer*/unsignedchar*curp;/*Currentactivepointer*/unsignedistemp;/*Temporaryfileindicator*/shorttoken;/*Usedforvaliditychecking*/}FILE;

教材P294有VC6.0下的結構定義141文件概述(9)1.4文件類型指針FILE*fp;文件打開時,系統自動建立文件結構體,并把指向它的指針返回來,程序通過這個指針獲得文件信息,訪問文件;文件關閉后,它的文件結構體被釋放。返回主菜單文件使用方式:打開文件-->文件讀/寫-->關閉文件152文件的打開與關閉(1)2.1打開文件函數原型:FILE*fopen(char*name,char*mode)stdio.h要打開的文件名使用文件方式返回值:正常打開,返回指向文件結構體的指針;打開失敗,為NULLP295頁162文件的打開與關閉(2)2.1打開文件課堂練習:①打開當前文件夾下的namelist.txt文件,打開方式為追加②打開d盤test文件夾下的namelist.txt文件,如果該文件不存在,就創(chuàng)建該文件,然后增加文件內容課堂練習編寫172文件的打開與關閉(3)2.2關閉文件函數原型:

int

fclose(FILE*fp)文件打開時返回的文件類型指針返回值:正常關閉為0;

出錯時,非0課堂練習:關閉前面課堂練習中打開的文件返回主菜單183文件的讀寫(1)3.1文件的順序讀寫—文件字符輸入/輸出函數函數原型:int

fputc(intc,FILE*fp)功能:把一字節(jié)代碼c寫入fp指向的文件中返值:正常,返回c;出錯,為EOF函數原型:int

fgetc(FILE*fp)功能:從fp指向的文件中讀取一字節(jié)代碼返值:正常,返回讀到的代碼值;

讀到文件尾(EOF)或出錯(NULL)為止193文件的讀寫(1)3.1文件的順序讀寫—文件字符輸入/輸出函數例1:從鍵盤輸入若干字符,逐個將它們寫入文件”file.txt”中,直到輸入一個”*”為止。例1編寫考慮如何編程完成將一個磁盤文件203文件的讀寫(2)3.1文件的順序讀寫—文件字符串輸入/輸出函數函數原型:int

fputs(char*string,FILE*fp);

功能:把字符串寫入fp指向的文件中返值:正常,返回0;出錯,為EOF函數原型:char*fgets(char*s,intn,FILE*fp);

功能:從fp指向的文件中讀取長度不超過n-1個字符返值:正常,返回讀到字符串的首地址;

讀到文件尾(EOF)或出錯(NULL)為止P300頁例11.2213文件的讀寫(3)3.1文件的順序讀寫—文件的格式化輸入/輸出函數int

fprintf(FILE*fp,constchar*format[,argument,…])int

fscanf(FILE*fp,constchar*format[,address,…])功能:按格式對文件進行I/O操作返值:成功,返回I/O的個數;出錯或文件尾,返回EOF223文件的讀寫(4)3.1文件的順序讀寫—文件的格式化輸入/輸出函數例3:有如下的學生結構定義,從鍵盤輸入4個學生的信息,保存到文件name-list.txt文件中struct

student_type{charname[10];

intnum;

intage;charaddr[15];}例3編寫233文件的讀寫(5)3.1文件的順序讀寫—文件的數據塊輸入/輸出函數實現文件操作一次讀取一組數據size_tfread(void*buffer,size_tsize,size_tcount,FILE*fp)size_tfwrite(void*buffer,size_tsize,size_tcount,FILE*fp)指向要輸入/輸出數據塊的首地址的指針每個要讀/寫的數據塊的大?。ㄗ止?jié)數)要讀/寫的數據塊的個數要讀/寫的文件指針返值:成功,返回讀/寫的塊數;出錯或文件尾,返回0P304頁例11.4243文件的讀寫(6)2文件的隨機讀寫操作—rewind函數將文件的指針指向用戶指定的位置,進行文件操作rewind函數函數原型:voidrewind(FILE*fp)功能:重置文件位置指針到文件開頭返值:無253文件的讀寫(7)2文件的隨機讀寫操作—rewind函數例4:分析下面程序的功能#include<stdio.h>main(){FILE*fp1,*fp2;fp1=fopen("file1.c","r");fp2=fopen("file2.c","w");

while(!feof(fp1))putchar(fgetc(fp1));rewind(fp1);

while(!feof(fp1))fputc(fgetc(fp1),fp2);fclose(fp1);fclose(fp2);}從文件中第一次將它內容顯示在屏幕中,第二次讀取將其復制到另一個文件中263文件的讀寫(7)2文件的隨機讀寫操作—fseek函數fseek函數函數原型:

int

fseek(FILE*fp,longoffset,intwhence)功能:改變文件位置指針的位置返值:成功,返回0;失敗,返回非0值273文件的讀寫(8)2文件的隨機讀寫操作—fseek函數例5:分析下面程序的功能#include"stdio.h"

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論