《C語言程序設計d》課件-第八講 文件_第1頁
《C語言程序設計d》課件-第八講 文件_第2頁
《C語言程序設計d》課件-第八講 文件_第3頁
《C語言程序設計d》課件-第八講 文件_第4頁
《C語言程序設計d》課件-第八講 文件_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1引言2輸入輸出概述輸入/輸出(簡稱I/O)是程序的一個重要組成部分,程序運行所需要的數(shù)據(jù)往往要從外設(如:鍵盤、文件等)得到,程序的運行結果通常也要輸出到外設(如:顯示器、打印機、文件等)中去。

3輸入輸出操作分類基于控制臺的I/O:從標準輸入設備(如:鍵盤)獲得數(shù)據(jù)把程序結果從標準輸出設備(如:顯示器)輸出基于文件的I/O:從外存文件獲得數(shù)據(jù)把程序結果保存到外存文件中4基于控制臺的I/O存在的問題程序中所有數(shù)據(jù)到程序結束時就自動釋放,有時程序運行結果需要永久性地保存起來,以供其它程序或本程序下一次運行時使用,可通過文件永久性地保存數(shù)據(jù)。大批量的數(shù)據(jù)重復輸入使用手工方式繁瑣易錯,使用文件輸入數(shù)據(jù)可以解決這個問題5主要內容文件的基本概念C語言文件操作68.1文件的基本概念7文件定義及類型文件定義一組相關信息的集合;平時存儲在外部介質上,需要時讀入內存,操作完畢后再寫回外部介質文件類型文本文件信息以文本(字符串)格式存儲文本分行,行尾有行結束標志一般用于存儲具有“行”結構的數(shù)據(jù),如源程序以及純文本格式的數(shù)據(jù)等。程序容易處理,程序員也容易理解二進制文件信息以二進制格式存儲內容不分行,行尾無行結束標志一般用于存儲無顯示結構的數(shù)據(jù),如目標代碼程序以及二進制數(shù)據(jù)等。程序容易處理,程序員不容易理解8文件指針C語言標準庫“stdio.h”定義了一個結構體類型FILE,用來描述程序中的文件,在實際編程時,需要定義一個指向該結構體類型的文件指針來操縱文件對象。定義文件變量定義格式:FILE*fp;說明:要訪問某個文件,一定需要首先定義文件指針類型的變量,并將該變量與對應文件關聯(lián)起來,此后才能進行文件操作98.2C語言文件操作10C語言文件I/O的基本步驟step1:打開文件fopenstep2:讀寫文件fprintf,fscanffputc,fgetc,fgets,fputsfwrite,freadstep3:關閉文件fclose說明:C標準庫“stdio.h”提供了豐富的函數(shù),程序員可直接調用這些函數(shù)來進行文件操作。11打開文件FILE*fopen(constchar*filename,constchar*mode);返回值:指向被打開文件的指針,后續(xù)的讀寫和關閉文件操作都需要該指針,文件打開失敗時返回空指針NULL參數(shù):filename:需要打開的文件名,可以是絕對路徑(例如“c:\\in.txt")或相對路徑(例如,"in.txt"),使用相對路徑時程序和文件需要在同一目錄下。mode:打開模式是讀還是寫,二進制還是文本12文件打開模式"r"讀模式,若文件不存在,則返回NULL"w"寫模式,若文件不存在則創(chuàng)建它,若文件已存在則其內容被擦除"a"寫模式,若文件不存在則創(chuàng)建它,若文件已存在則保留原內容,信息追加到文件尾部"r+"讀寫模式,文件必須已存在,否則返回NULL"w+"讀寫模式,若文件不存在則創(chuàng)建它,若文件已存在則其內容被擦除"a+"讀寫模式,若文件不存在則創(chuàng)建它,若文件已存在則保留原內容,信息追加到文件尾部"b"以二進制方式打開,必須和前面幾種模式一起使用13常用的幾種打開文件模式打開一個文本文件用于讀數(shù)據(jù)打開一個文本文件用于寫數(shù)據(jù)打開一個文本文件用于讀寫數(shù)據(jù)FILE*fp=fopen("abc.txt","r");if(fp==NULL){…

}FILE*fp=fopen("abc.txt","w");if(fp==NULL){…}FILE*fp=fopen("abc.txt","r+");if(fp==NULL){…

}注意:一定要檢查fopen函數(shù)的返回值。14常用的幾種打開文件模式打開一個二進制文件用于讀數(shù)據(jù)打開一個二進制文件用于寫數(shù)據(jù)打開一個二進制文件用讀寫數(shù)據(jù)FILE*fp=fopen("abc.txt","rb");if(fp==NULL){…

}FILE*fp=fopen("abc.txt","wb");if(fp==NULL){…}FILE*fp=fopen("abc.txt","r+b");if(fp==NULL){…

}15關閉文件intfclose(FILE*fp);返回值:返回0表示成功,返回-1表示失敗參數(shù):fp:由fopen返回的文件指針FILE*fp=fopen("abc.txt","r");if(fp!=NULL){…

fclose(fp);}intfcloseall();用于多個文件的關閉操作16文件結束檢測操作intfeof(FILE*fp);

返回值:返回0表示文件未結束,否則表示文件結束參數(shù):fp:待檢測的文件指針FILE*fp=fopen("abc.txt","r");if(fp!=NULL){while(!feof(fp)){//文件的具體操作在此}

fclose(fp);}每個文件都具有至少一個文件結束標記EOF,C程序可以根據(jù)此標志判斷是否已達到文件結尾。17文件讀寫操作面向字符的文件讀寫操作fgetc,fputc面向文本行的文件讀寫操作fgets,fputs面向格式化輸入輸出的文件讀寫操作fscanf,fprintf面向信息塊的文件讀寫操作fread,fwrite18面向字符的文件讀寫操作19從文本文件讀取一個字符intfgetc(FILE*stream);參數(shù):stream:打開的文件指針返回值:EOF表示讀取失敗或文件結束,否則返回讀到的字符20向文本文件寫入一個字符intfputc(intc,FILE*stream);參數(shù):stream:打開的文件指針c:待寫入的字符返回值:EOF表示寫入失敗,否則返回寫入的字符21示例1:編寫程序,完成文件復制(copy.c)#include<stdio.h>intmain(){ FILE*fpr=fopen("input.txt","r"); FILE*fpw=fopen("output.txt","w"); charch; if(fpr==NULL||fpw==NULL){ printf("openfileerror\n"); return1; }

while((ch=fgetc(fpr))!=EOF){ fputc(ch,fpw); } fclose(fpr); fclose(fpw); return0;}22面向文本行的文件讀寫操作23從文本文件讀取一行字符char*fgets(char*string,intn,FILE*stream);參數(shù):stream:打開的文件指針string:保存讀到的一行字符n:一行字符的文本數(shù)量限制返回值:NULL表示讀取失敗或文件結束,否則返回參數(shù)string24從文本文件讀取一行字符讀取過程:如果讀取過程遇到換行符'\n',輸入結束,換行符也被放入string中,如果在讀了n-1個字符后未遇到換行符,輸入結束以上兩種情況都會在最后添加一個字符結束標志'\0'25向文本文件寫入一個字符串intfputs(constchar*string,FILE*stream);參數(shù):stream:打開的文件指針string:待寫入的字符串返回值:EOF表示寫入失敗,否則返回非負整數(shù)#include<stdio.h>intmain(){ FILE*fpr=fopen("input.txt","r"); FILE*fpw=fopen("output.txt","w"); charbuf[100]; if(fpr==NULL||fpw==NULL){ printf("openfileerror\n"); return0; }

while(fgets(buf,100,fpr)!=NULL){

fputs(buf,fpw);

} fclose(fpr); fclose(fpw); return0;}27面向格式化輸入輸出的文件讀寫操作28文本文件格式化輸入intfscanf(FILE*stream,constchar*format[,argument]...);參數(shù):stream:打開的文件指針format:格式控制字符串,與scanf相同其他參數(shù):存儲讀到的數(shù)據(jù),必須是指針(地址)返回值:正確讀取的數(shù)據(jù)個數(shù),EOF表示讀取錯誤或到了文件結束。29示例2:數(shù)組排序(sort.c)文件“data.in”中存放了若干整數(shù),第一行為數(shù)據(jù)個數(shù)n(不超過1000),其后為n個整數(shù),以空格隔開,要求將這些整數(shù)從大到小輸出。30文本文件格式化輸出intfprintf(FILE*stream,constchar*format[,argument]...);參數(shù):stream:打開的文件指針format:格式控制字符串,與printf相同,P276-277其他參數(shù):待輸出的數(shù)據(jù)返回值:正確寫入的數(shù)據(jù)個數(shù),負值表示寫入錯誤。31示例3:灰度圖像二值化(gray2wb.c)題目描述:一幅m×n的灰度圖像(0<m,n<=256)可以用一個二維矩陣表示,矩陣中的每個元素表示對應像素的灰度值?;叶葓D像二值化是將灰度圖像每個像素點的灰度級變成只有兩個值0或1,二值化方法是用每個像素點的灰度和一個閾值進行比較,大于等于該閾值則在二值化結果為1,否則二值化結果為0。閾值的選取可以用統(tǒng)計方法求出灰度圖像所有像素點的灰度平均值(用整除求平均值)?,F(xiàn)給出一個矩陣表示的灰度圖像,輸出二值化后的矩陣。輸入格式說明:輸入數(shù)據(jù)來自文件“image.in”,輸入第一行為兩個整數(shù)m和n分別表示圖像的寬度和高度,其后是n行數(shù)據(jù),每行m個整數(shù),分別表示圖像各個像素的灰度值。輸出格式說明:輸出n行數(shù)據(jù)到文件“image.out”,每行數(shù)據(jù)由m個整數(shù)組成,表示二值化后圖像的各個像素點的灰度,整數(shù)之間用空格分隔。輸入樣例:540 1 0 2 83 4 8 5 912 14 10 6 71 15 3 6 10

輸出樣例:0000100101111110101132示例4(inverse.c)矩陣轉置。矩陣可以用文件表示:第一行是矩陣的行數(shù)和列數(shù),后面每行都是矩陣內容的一行。編寫一個程序,從文件中讀入原始矩陣,將轉置后的矩陣寫入另一個文件。341002004030004310300004020033step1:從文件讀入原始矩陣intmain(){FILE*fp;introw,col,i,j,a[MAX_ROW][MAX_COL];

fp=fopen("a.txt","r");

//打開原始文件

if(fp==NULL){printf("openinputfilefail\n");return1;}

fscanf(fp,"%d%d",&row,&col);

//從文件讀入矩陣行數(shù)和列數(shù)for(i=0;i<row;i++)for(j=0;j<col;j++)

fscanf(fp,"%d",&a[i][j]);

//依次讀入每個元素

fclose(fp);...34step2:向文件寫入轉置矩陣

fp=fopen("at.txt","w");//打開轉置矩陣文件,不存在則創(chuàng)建if(fp==NULL){printf("openoutputfilefail\n");return1;}

fprintf(fp,"%d%d\

溫馨提示

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

評論

0/150

提交評論