




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言程序設計姚望舒計算機科學與技術學院蘇州大學C語言程序設計姚望舒1第10章對文件的輸入輸出10.1C文件的有關基本知識10.2打開與關閉文件10.3順序讀寫數據文件10.4隨機讀寫數據文件10.5文件讀寫的出錯檢測第10章對文件的輸入輸出10.1C文件的有關基本知識210.1C文件的有關基本知識10.1.1什么是文件10.1.2文件名10.1.3文件的分類10.1.4文件緩沖區10.1.5文件類型指針10.1C文件的有關基本知識10.1.1什么是文件3C語言程序設計第10章對文件的輸入輸出[精]課件4C語言程序設計第10章對文件的輸入輸出[精]課件5C語言程序設計第10章對文件的輸入輸出[精]課件610.1.1什么是文件輸入輸出是數據傳送的過程,數據如流水一樣從一處流向另一處,因此常將輸入輸出形象地稱為流(stream),即數據流。流表示了信息從源到目的端的流動。輸入操作時,數據從文件流向計算機內存輸出操作時,數據從計算機流向文件“流”是一個傳輸通道,數據可以從運行環境流入程序中,或從程序流至運行環境10.1.1什么是文件輸入輸出是數據傳送的過程,數據如流水710.1.1什么是文件從C程序的觀點來看,無論程序一次讀寫一個字符,或一行文字,或一個指定的數據區,作為輸入輸出的各種文件或設備都是統一以邏輯數據流的方式出現的。C語言把文件看作是一個字符(或字節)的序列。一個輸入輸出流就是一個字符流或字節(內容為二進制數據)流。10.1.1什么是文件從C程序的觀點來看,無論程序一次讀寫810.1.1什么是文件C的數據文件由一連串的字符(或字節)組成,而不考慮行的界限,兩行數據間不會自動加分隔符,對文件的存取是以字符(字節)為單位的。輸入輸出數據流的開始和結束僅受程序控制而不受物理符號(如回車換行符)控制,這就增加了處理的靈活性。這種文件稱為流式文件。10.1.1什么是文件C的數據文件由一連串的字符(或字節)910.1.2文件名文件要有一個唯一的文件標識,以便用戶識別和引用。文件標識包括三部分:(1)文件路徑(2)文件名主干(3)文件后綴10.1.2文件名文件要有一個唯一的文件標識,以便用戶識別1010.1.2文件名文件路徑表示文件在外部存儲設備中的位置。如:D:\CC\temp\file1.dat表示file1.dat文件存放在D盤中的CC目錄下的temp子目錄下面文件路徑文件名主干文件后綴10.1.2文件名文件路徑表示文件在外部存儲設備中的位置。1110.1.2文件名文件路徑表示文件在外部存儲設備中的位置。如:D:\CC\temp\file1.dat表示file1.dat文件存放在D盤中的CC目錄下的temp子目錄下面文件名10.1.2文件名文件路徑表示文件在外部存儲設備中的位置。1210.1.2文件名文件路徑表示文件在外部存儲設備中的位置。如:D:\CC\temp\file1.dat表示file1.dat文件存放在D盤中的CC目錄下的temp子目錄下面命名規則遵循標識符的命名規則10.1.2文件名文件路徑表示文件在外部存儲設備中的位置。1310.1.2文件名文件路徑表示文件在外部存儲設備中的位置。如:D:\CC\temp\file1.dat表示file1.dat文件存放在D盤中的CC目錄下的temp子目錄下面一般不超過3個字母(doc、txt、dat、c、cpp、obj、exe、ppt、bmp等)10.1.2文件名文件路徑表示文件在外部存儲設備中的位置。1410.1.3文件的分類根據數據的組織形式,數據文件可分為ASCII文件和二進制文件。數據在內存中是以二進制形式存儲的,如果不加轉換地輸出到外存,就是二進制文件如果要求在外存上以ASCII代碼形式存儲,則需要在存儲前進行轉換ASCII文件又稱文本文件,每一個字節放一個字符的ASCII代碼10.1.3文件的分類根據數據的組織形式,數據文件可分為A1510.1.3文件的分類字符一律以ASCII形式存儲數值型數據既可以用ASCII形式存儲,也可以用二進制形式存儲如有整數10000,如果用ASCII碼形式輸出到磁盤,則在磁盤中占5個字節(每一個字符占一個字節),而用二進制形式輸出,則在磁盤上只占4個字節(用VC++C時)10.1.3文件的分類字符一律以ASCII形式存儲1610.1.3文件的分類(1)(0)(0)(0)(0)ASCII形式二進制形式(10000)10.1.3文件的分類(1)(0)(0)(0)(0)ASC1710.1.4文件緩沖區ANSIC標準采用“緩沖文件系統”處理數據文件所謂緩沖文件系統是指系統自動地在內存區為程序中每一個正在使用的文件開辟一個文件緩沖區10.1.4文件緩沖區ANSIC標準采用“緩沖文件系統”1810.1.4文件緩沖區從內存向磁盤輸出數據必須先送到內存中的緩沖區,裝滿緩沖區后才一起送到磁盤去如果從磁盤向計算機讀入數據,則一次從磁盤文件將一批數據輸入到內存緩沖區(充滿緩沖區),然后再從緩沖區逐個地將數據送到程序數據區(給程序變量)10.1.4文件緩沖區從內存向磁盤輸出數據必須先送到內存中1910.1.4文件緩沖區程序數據區輸出文件緩沖區輸入文件緩沖區磁盤從內存向磁盤輸出數據裝滿緩沖區10.1.4文件緩沖區程序數據區輸出文件緩沖區輸入文件緩沖2010.1.4文件緩沖區程序數據區輸出文件緩沖區輸入文件緩沖區磁盤從磁盤向計算機讀入數據充滿緩沖區10.1.4文件緩沖區程序數據區輸出文件緩沖區輸入文件緩沖2110.1.5文件類型指針緩沖文件系統中,關鍵的概念是“文件類型指針”,簡稱“文件指針”每個被使用的文件都在內存中開辟一個相應的文件信息區,用來存放文件的有關信息(如文件的名字、文件狀態及文件當前位置等)這些信息是保存在一個結構體變量中的。該結構體類型是由系統聲明的,取名為FILE10.1.5文件類型指針緩沖文件系統中,關鍵的概念是“文2210.1.5文件類型指針聲明FILE結構體類型的信息包含在頭文件“stdio.h”中一般設置一個指向FILE類型變量的指針變量,然后通過它來引用這些FILE類型變量10.1.5文件類型指針聲明FILE結構體類型的信息包含2310.1.5文件類型指針FILE
*fp1,*fp2,*fp3;文件f1的文件信息區fp1文件f2的文件信息區fp2文件f3的文件信息區fp310.1.5文件類型指針FILE*fp1,*fp2,*2410.2打開與關閉文件10.2.1用fopen函數打開數據文件10.2.2用fclose函數關閉數據文件10.2打開與關閉文件10.2.1用fopen函數打開數2510.2.1用fopen函數打開數據文件對文件讀寫之前應該“打開”該文件,在使用結束之后應“關閉”該文件。所謂“打開”是指為文件建立相應的信息區(用來存放有關文件的信息)和文件緩沖區(用來暫時存放輸入輸出的數據)。10.2.1用fopen函數打開數據文件對文件讀寫之前應該2610.2.1用fopen函數打開數據文件在編寫程序時,在打開文件的同時,一般都指定一個指針變量指向該文件,也就是建立起指針變量與文件之間的聯系,這樣就可以通過該指針變量對文件進行讀寫所謂“關閉”是指撤銷文件信息區和文件緩沖區10.2.1用fopen函數打開數據文件在編寫程序時,在打2710.2.1用fopen函數打開數據文件fopen函數的調用方式為:FILE*fopen(文件名,使用文件方式);例如:
fopen(“a1”,”r”);表示要打開名為“a1”的文件,使用文件方式為“讀入”fopen函數的返回值是指向a1文件的指針10.2.1用fopen函數打開數據文件fopen函數的調2810.2.1用fopen函數打開數據文件通常將fopen函數的返回值賦給一個指向文件的指針變量。如:FILE*fp;fp=fopen(“a1”,”r”);fp和文件a1相聯系,fp指向了a1文件a1:有兩種形式文件名:表示文件在工程路徑絕對路徑:絕對路徑+文件名10.2.1用fopen函數打開數據文件通常將fopen函2910.2.1用fopen函數打開數據文件在打開一個文件時,通知編譯系統以下3個信息:①需要訪問的文件的名字②使用文件的方式(“讀”還是“寫”等)③讓哪一個指針變量指向被打開的文件使用文件方式參見教材表10.1。10.2.1用fopen函數打開數據文件在打開一個文件時,30說明:(1)用“r”方式打開的文件只能用于向計算機輸入而不能用作向該文件輸出數據,而且該文件應該已經存在,并存有數據,這樣程序才能從文件中讀數據。不能用“r”方式打開一個并不存在的文件,否則出錯。說明:31說明:(2)用“w”方式打開的文件只能用于向該文件寫數據(即輸出文件),而不能用來向計算機輸入。如果原來不存在該文件,則在打開文件前新建立一個以指定的名字命名的文件。如果原來已存在一個以該文件名命名的文件,則在打開文件前先將該文件刪去,然后重新建立一個新文件。說明:32說明:(3)如果希望向文件末尾添加新的數據(不希望刪除原有數據),則應該用“a”方式打開但此時應保證該文件已存在;否則將得到出錯信息。打開文件時,文件讀寫標記移到文件末尾說明:33說明:(4)用r+、w+、a+方式打開的文件既可以用來輸入數據,也可以用來輸出數據。用r+方式時該文件應該已經存在。用w+方式則新建立一個文件,先向此文件寫數據,然后可以讀此文件中的數據。用a+方式打開的文件,原來的文件不被刪去,文件讀寫位置標記移到文件末尾,可以添加,也可以讀。說明:34說明:(5)如果打開失敗,fopen函數將會帶回一個出錯信息。fopen函數將帶回一個空指針值NULL常用下面的方法打開一個文件:if((fp=fopen(“file1”,’r″))==NULL)
{printf(“cannotopenthisfile\n”);exit(0);
}終止正在執行的程序說明:終止正在執行的程序35說明:(6)C標準建議用表10.1列出的文件使用方式打開文本文件或二進制文件,但目前使用的有些C編譯系統可能不完全提供所有這些功能說明:36說明:(7)計算機輸從ASCII文件讀入字符時,遇到回車換行符,系統把它轉換為一個換行符,在輸出時把換行符轉換成為回車和換行兩個字符。在用二進制文件時,不進行這種轉換,在內存中的數據形式與輸出到外部文件中的數據形式完全一致,一一對應。說明:37說明:(8)程序中可以使用3個標準的流文件:標準輸入流、標準輸出流、標準出錯輸出流。系統已對這3個文件指定了與終端的對應關系標準輸入流是從終端的輸入標準輸出流是向終端的輸出標準出錯輸出流是當程序出錯時將出錯信息發送到終端說明:38程序開始運行時系統自動打開這3個標準流文件。因此,程序編寫者不需要在程序中用fopen函數打開它們。所以以前我們用到的從終端輸入或輸出到終端都不需要打開終端文件。程序開始運行時系統自動打開這3個標準流文件。因此,程序編寫者3910.2.2用fclose函數關閉數據文件關閉文件用fclose函數。fclose函數調用的一般形式為fclose(文件指針);例如:
fclose(fp);如果不關閉文件將會丟失數據。10.2.2用fclose函數關閉數據文件關閉文件用fcl4010.3順序讀寫數據文件在順序寫時,先寫入的數據存放在文件中前面,后寫入的數據存放在文件中后面在順序讀時,先讀文件中前面的數據,后讀文件中后面的數據對順序讀寫來說,對文件讀寫數據的順序和數據在文件中的物理順序是一致的順序讀寫需要用庫函數實現10.3順序讀寫數據文件在順序寫時,先寫入的數據存放在文件4110.3順序讀寫數據文件10.3.1怎樣向文件讀寫字符10.3.2怎樣向文件讀寫一個字符串10.3.3用格式化的方式讀寫文件10.3.4用二進制方式向文件讀寫一組數據10.3順序讀寫數據文件10.3.1怎樣向文件讀寫字符4210.3.1怎樣向文件讀寫字符讀寫一個字符的函數10.3.1怎樣向文件讀寫字符讀寫一個字符的函數43
例10.1從鍵盤輸入一些字符,逐個把它們送到磁盤上去,直到用戶輸入一個“#”為止。
解題思路:用fgetc函數從鍵盤逐個輸入字符,然后用fputc函數寫到磁盤文件即可。例10.1從鍵盤輸入一些字符,逐個把它們送到磁盤上去,44#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;charch,filename[10];printf("請輸入所用的文件名:");scanf("%s",filename);if((fp=fopen(filename,“w”))==NULL) {printf("無法打開此文件\n");exit(0);}ch=getchar();接收最后輸入的回車符輸入文件名只寫用exit函數時加#include<stdio.h>接收最后輸入的回車符輸入45printf(“請輸入一個字符串(以#結束):");ch=getchar();while(ch!=‘#’) {fputc(ch,fp);putchar(ch); ch=getchar(); }
fclose(fp);putchar(‘\n’);return0;}printf(“請輸入一個字符串(以#結束):");46
例10.2將一個磁盤文件中的信息復制到另一個磁盤文件中。今要求將上例建立的file1.dat文件中的內容復制到另一個磁盤文件file2.dat中。解題思路:處理此問題的算法是:從file1.dat文件中逐個讀入字符,然后逐個輸出到file2.dat中。例10.2將一個磁盤文件中的信息復制到另一個磁盤文件中47#include<stdio.h>#include<stdlib.h>intmain(){FILE*in,*out;charch,infile[10],outfile[10];printf("輸入讀入文件的名字:");scanf("%s",infile);printf("輸入輸出文件的名字:");scanf(“%s”,outfile);if((in=fopen(infile,“r”))==NULL){printf("無法打開此文件\n");exit(0);}if((out=fopen(outfile,“w”))==NULL){printf("無法打開此文件\n");exit(0);}改為rb和wb,則復制一個二進制文件改為rb和wb,則復制一個二進制文件#include<stdio.h>改為rb和wb,則復制一48while(!feof(in)){ch=fgetc(in);
fputc(ch,out);putchar(ch);}putchar(‘\n’);fclose(in);fclose(out);return0;}檢查當前讀寫位置是否移到文件末尾while(!feof(in))檢查當前讀寫位置49feof()函數功能:用于判斷文件讀取是否結束,如果已經讀到文件結束處,這時,再進行讀取操作時,feof()函數非0,否則返回0.//錯誤程序charc;
while(!feof(fp))
{
c=fgetc(fp);
printf("%c\n",c);
}//正確程序charc;
c=fgetc(fp);
while(!feof(fp))
{
printf("%c\n",c);
c=fgetc(fp);
}feof()函數功能://錯誤程序//正確程序5010.3.2怎樣向文件讀寫一個字符串讀寫一個字符串的函數10.3.2怎樣向文件讀寫一個字符串讀寫一個字符串的函數51說明:fgets函數的函數原型為:char*fgets(char*str,intn,FILE*fp);其作用是從文件讀入一個字符串調用時可以寫成:fgets(str,n,fp);說明:52說明:fgets(str,n,fp);中n是要求得到的字符個數,但實際上只讀n-1個字符,然后在最后加一個’\0’字符,這樣得到的字符串共有n個字符,把它們放到字符數組str中如果在讀完n-1個字符之前遇到換行符“\n”或文件結束符EOF,讀入即結束,但將所遇到的換行符“\n”也作為一個字符讀入執行fgets成功,返回str數組首地址,如果一開始就遇到文件尾或讀數據錯,返回NULL說明:53說明:fputs函數的函數原型為:intfputs(char*str,FILE*fp);str指向的字符串輸出到fp所指向的文件中調用時可以寫成:fputs(″China”,fp);fputs函數中第一個參數可以是字符串常量、字符數組名或字符型指針字符串末尾的′\0′不輸出,也不自動添加換行符號。輸出成功,函數值為0;失敗,函數值為EOF說明:54
例10.3從鍵盤讀入若干個字符串,對它們按字母大小的順序排序,然后把排好序的字符串送到磁盤文件中保存。解題思路:為解決問題,可分為三個步驟:從鍵盤讀入n個字符串,存放在一個二維字符數組中,每一個一維數組存放一個字符串;對字符數組中的n個字符串按字母順序排序,排好序的字符串仍存放在字符數組中;將字符數組中的字符串順序輸出。例10.3從鍵盤讀入若干個字符串,對它們按字母大小的順55#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){FILE*fp;charstr[3][10],temp[10];inti,j,k,n=3;printf(“Enterstrings:\n”);for(i=0;i<n;i++)gets(str[i]);#include<stdio.h>56for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++) if(strcmp(str[k],str[j])>0)k=j;if(k!=i) {strcpy(temp,str[i]); strcpy(str[i],str[k]); strcpy(str[k],temp);}}for(i=0;i<n-1;i++)57if((fp=fopen(“D:\\CC\\string.dat”,“w”))==NULL){printf("can'topenfile!\n");exit(0);}printf("\nThenewsequence:\n");for(i=0;i<n;i++) {fputs(str[i],fp);fputs(“\n”,fp); printf(“%s\n”,str[i]);} fclose(fp);return0;}人為地輸出一個’\n’if((fp=fopen(“D:\\CC\\stri58思考:從文件string.dat中讀回字符串,并在屏幕上顯示,應如何編寫程序?思考:59#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;charstr[3][10];inti=0;if((fp=fopen(“D:\\CC\\string.dat”,“r”))==NULL){printf("can'topenfile!\n");exit(0);}while(fgets(str[i],10,fp)!=NULL){printf("%s",str[i]);i++;}fclose(fp);return0;}不用人為地輸出’\n’#include<stdio.h>不用人為地輸出’\n’6010.3.3用格式化的方式讀寫文件一般調用方式為:fprintf(文件指針,格式字符串,輸出表列);fscanf(文件指針,格式字符串,輸入表列);如:fprintf(fp,”%d,%6.2f”,i,f);fscanf(fp,”%d,%f”,&i,&f);10.3.3用格式化的方式讀寫文件一般調用方式為:61文件讀寫舉例L104.c在D盤根目錄下有文件A.txt,該文件包含n行字符數據。編寫程序完成如下功能:編寫函數讀取A.txt文件的數據。編寫函數,將文件中所有非數字字符以其ASCII值轉換成數字字符,例如:’A‘轉換成’6‘和’5‘兩個數字字符,并輸出到屏幕上。編寫函數,將原文件中的字符以其ASCII值輸出到D盤根目錄下的文件B.txt中。文件讀寫舉例L104.c在D盤根目錄下有文件A.txt,該文6210.3.4用二進制方式向文件讀寫一組數據一般調用形式為:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);
10.3.4用二進制方式向文件讀寫一組數據一般調用形式為:6310.3.4用二進制方式向文件讀寫一組數據buffer:是一個地址對fread來說,它是用來存放從文件讀入的數據的存儲區的地址對fwrite來說,是要把此地址開始的存儲區中的數據向文件輸出size:要讀寫的字節數count:要讀寫多少個數據項fp:FILE類型指針10.3.4用二進制方式向文件讀寫一組數據buffer:是64
例10.5從鍵盤輸入10個學生的有關數據,然后把它們轉存到磁盤文件上去。
解題思路:定義有10個元素的結構體數組,用來存放10個學生的數據從main函數輸入10個學生的數據用save函數實現向磁盤輸出學生數據用fwrite函數一次輸出一個學生的數據例10.5從鍵盤輸入10個學生的有關數據,然后把它們轉65#include<stdio.h>#defineSIZE10typedefstructStudent_type{charname[10];intnum;intage;charaddr[15];}TAGSTUDENT;TAGSTUDENTstud[SIZE];#include<stdio.h>66voidsave(){FILE*fp;inti;if((fp=fopen("stu.dat","wb"))==NULL){printf("cannotopenfile\n");return;}for(i=0;i<SIZE;i++)if(fwrite(&stud[i],
sizeof(structStudent_type),1,fp)!=1)printf("filewriteerror\n");fclose(fp);}10+4+4+15=33,實際上開辟36字節,是4的倍數當前路徑下的文件voidsave()10+4+4+15=33,實際67intmain(){inti;printf(“enterdataofstudents:\n");for(i=0;i<SIZE;i++)scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);save();return0;}intmain()68為了驗證在磁盤文件“stu.dat”中是否已存在此數據,可以用以下程序從“stu.dat”文件中讀入數據,然后在屏幕上輸出。為了驗證在磁盤文件“stu.dat”中是否已存在此數據,可以69#include<stdio.h>#include<stdlib.h>#defineSIZE10structStudent_type{charname[10];intnum;intage;charaddr[15];}stud[SIZE];#include<stdio.h>70intmain(){inti;FILE*fp;if((fp=fopen("stu.dat","rb"))==NULL){printf("cannotopenfile\n");exit(0);}for(i=0;i<SIZE;i++){fread(&stud[i],sizeof(structStudent_type),1,fp);printf(“%-10s%4d%4d%-15s\n”,stud[i].name,stud[i].num,stud[i].age,stud[i].addr);}fclose(fp);return0;}intmain()71
如果修改例10.4:從已有的二進制文件“stu.list”中,讀入數據并輸出到“stu.dat”文件中,應如何修改程序?
解題思路:編寫load函數main函數中再調用load函數如果修改例10.4:從已有的二進制文件“stu.list72voidload(){FILE*fp;inti;if((fp=fopen("stu_list","rb"))==NULL){printf("cannotopeninfile\n");return;}for(i=0;i<SIZE;i++)if(fread(&stud[i],sizeof(structstudent_type),1,fp)!=1){if(feof(fp)) {fclose(fp);return;}printf("filereaderror\n");}fclose(fp);}voidload()73intmain(){load();
save();return0;}intmain()7410.4隨機讀寫數據文件對文件進行順序讀寫比較容易理解,也容易操作,但有時效率不高隨機訪問不是按數據在文件中的物理位置次序進行讀寫,而是可以對任何位置上的數據進行訪問,顯然這種方法比順序訪問效率高得多10.4隨機讀寫數據文件對文件進行順序讀寫比較容易理解,也7510.4隨機讀寫數據文件10.4.1文件位置標記及其定位10.4.2隨機讀寫10.4隨機讀寫數據文件10.4.1文件位置標記及其定位7610.4.1文件位置標記及其定位1.文件位置標記為了對讀寫進行控制,系統為每個文件設置了一個文件讀寫位置標記(簡稱文件標記),用來指示“接下來要讀寫的下一個字符的位置”10.4.1文件位置標記及其定位1.文件位置標記7710.4.1文件位置標記及其定位文件指針讀寫當前位置文件尾1.文件位置標記文件頭10.4.1文件位置標記及其定位文件指針讀寫當前位置文件尾7810.4.1文件位置標記及其定位1.文件位置標記一般情況下,在對字符文件進行順序讀寫時,文件標記指向文件開頭,進行讀的操作時,就讀第一個字符,然后文件標記向后移一個位置,在下一次讀操作時,就將位置標記指向的第二個字符讀入。依此類推,直到遇文件尾,結束10.4.1文件位置標記及其定位1.文件位置標記7910.4.1文件位置標記及其定位1.文件位置標記如果是順序寫文件,則每寫完一個數據后,文件標記順序向后移一個位置,然后在下一次執行寫操作時把數據寫入指針所指的位置。直到把全部數據寫完,此時文件位置標記在最后一個數據之后10.4.1文件位置標記及其定位1.文件位置標記8010.4.1文件位置標記及其定位1.文件位置標記可以根據讀寫的需要,人為地移動了文件標記的位置。文件標記可以向前移、向后移,移到文件頭或文件尾,然后對該位置進行讀寫——隨機讀寫隨機讀寫可以在任何位置寫入數據,在任何位置讀取數據10.4.1文件位置標記及其定位1.文件位置標記8110.4.1文件位置標記及其定位2.文件位置標記的定位可以強制使文件位置標記指向指定的位置可以用以下函數實現:(1)用rewind函數使文件標記指向文件開頭rewind函數的作用是使文件標記重新返回文件的開頭,此函數沒有返回值。10.4.1文件位置標記及其定位2.文件位置標記的定位82
例10.5有一個磁盤文件,內有一些信息。要求第一次將它的內容顯示在屏幕上,第二次把它復制到另一文件上。例10.5有一個磁盤文件,內有一些信息。要求第一次將它83解題思路:因為在第一次讀入完文件內容后,文件標記已指到文件的末尾,如果再接著讀數據,就遇到文件結束標志,feof函數的值等于1(真),無法再讀數據必須在程序中用rewind函數使位置指針返回文件的開頭解題思路:84#include<stdio.h>intmain(){FILE*fp1,*fp2;fp1=fopen(“file1.dat”,“r”);fp2=fopen(“file2.dat”,“w”);while(!feof(fp1))putchar(getc(fp1));putchar(10);
rewind(fp1);while(!feof(fp1))putc(getc(fp1),fp2);fclose(fp1);fclose(fp2);return0;}#include<stdio.h>8510.4.1文件位置標記及其定位2.文件位置標記的定位可以強制使文件標記指向指定的位置可以用以下函數實現:(2)用fseek函數改變文件標記fseek函數的調用形式為:fseek(文件類型指針,位移量,起始點)起始點0代表“文件開始位置”,1為“當前位置”,2為“文件末尾位置”10.4.1文件位置標記及其定位2.文件位置標記的定位86C標準指定的名字C標準指定的名字87位移量指以起始點為基點,向前移動的字節數。位移量應是long型數據(在數字的末尾加一個字母L)。fseek函數一般用于二進制文件。下面是fseek函數調用的幾個例子:
fseek(fp,100L,0);fseek(fp,50L,1);fseek(fp,-10L,2);位移量指以起始點為基點,向前移動的字節數。位移量應是long8810.4.1文件位置標記及其定位2.文件位置標記的定位可以強制使文件位置標記指向指定的位置可以用以下函數實現:(3)用ftell函數測定文件位置標記的當前位置ftell函數的作用是得到流式文件中文件位置標記的當前位置。10.4.1文件位置標記及其定位2.文件位置標記的定位89由于文件中的文件位置標記經常移動,人們往往不容易知道其當前位置,所以常用ftell函數得到當前位置,用相對于文件開頭的位移量來表示。如果調用函數時出錯(如不存在fp指向的文件),ftell函數返回值為-1L。例如:i=ftell(fp);if(i==-1L)printf(“error\n”);由于文件中的文件位置標記經常移動,人們往往不容易知道其當前位9010.4.2隨機讀寫
例10.6在磁盤文件上存有10個學生的數據。要求將第1,3,5,7,9個學生數據輸入計算機,并在屏幕上顯示出來。要求:從例10.4中建立的“stu.dat”中讀入數據10.4.2隨機讀寫例10.6在磁盤文件上存有109110.4.2隨機讀寫解題思路:按二進制只讀方式打開文件將文件位置標記指向文件的開頭,讀入一個學生的信息,并把它顯示在屏幕上再將文件標記指向文件中第3,5,7,9個學生的數據區的開頭,讀入相應學生的信息,并把它顯示在屏幕上關閉文件10.4.2隨機讀寫解題思路:92#include<stdio.h>#include<stdlib.h>structSt{charname[10];intnum;intage;charaddr[15];}stud[10];#include<stdio.h>93intmain(){inti;FILE*fp;if((fp=fopen(“stu.dat”,“rb”))==NULL){printf("cannotopenfile\n");exit(0);}for(i=0;i<10;i+=2){fseek(fp,i*sizeof(structSt),0);fread(&stud[i],sizeof(structSt),1,fp);printf(“%-10s%4d%4d%-15s\n”,stud[i].name,stud[i].num,stud[i].age,stud[i].addr);}fclose(fp);return0;}intmain()9410.5文件讀寫的出錯檢測1.ferror函數ferror函數的一般調用形式為ferror(fp);如果返回值為0,表示未出錯,否則表示出錯每次調用輸入輸出函數,都產生新的ferror函數值,因此調用輸入輸出函數后立即檢查調用fopen時,ferror的初始值自動置為010.5文件讀寫的出錯檢測1.ferror函數9510.5文件讀寫的出錯檢測2.clearerr函數作用是使文件錯誤標志和文件結束標志置為0調用一個輸入輸出函數時出現錯誤(ferror值為非零值),立即調用clearerr(fp),使ferror(fp)值變0,以便再進行下一次檢測只要出現文件讀寫錯誤標志,它就一直保留,直到對同一文件調用clearerr函數或rewind函數,或任何其他一個輸入輸出函數10.5文件讀寫的出錯檢測2.clearerr函數96補充:文件讀取結束的方法使用feof()函數適用于:文本文件和二進制文件舉例(1)L105.c:在D盤有一文本文件A.txt,要求將文件復制到E盤,并重命名為B.txt文件,并將文件內容輸出到屏幕上。補充:文件讀取結束的方法使用feof()函數97補充:文件讀取結束的方法舉例(2)在D盤有一二進制文件data02.dat,文件中包含不超過50個整數信息,要求讀取所有數據,并將數據按從低到高排序,然后將排序后的數據輸出到屏幕上和D盤下的文本文件data02.txt中補充:文件讀取結束的方法舉例(2)98補充:文件讀取結束的方法舉例(3)在D盤有一二進制文件data_book.dat,文件中包含不超過50個book的信息,要求讀取所有書本數據,并按書的價格從低到高排序,然后將所有書本信息輸出到屏幕上和D盤下的文本文件data_book.txt中,其中book信息結構如下:struct_Book{charname[20];charauthor[20];floatprice;//價格}補充:文件讀取結束的方法舉例(3)99補充:文件讀取結束的方法使用fseek()函數計算文件數據塊個數步驟:打開文件使用fseek(fp,0,SEEK_END)定位文件指針到文件末端使用size=ftell(fp)計算二進制文件的字節數使用num=size/sizeof(信息塊大小)計算信息塊數量使用fseek(fp,0,SEEK_SET)重新定位文件指針到文件開始位置使用循環讀取num塊數據就ok只適用于二進制文件舉例(2)補充:文件讀取結束的方法使用fseek()函數計算文件數據塊100補充例題9設D盤根目錄下有一個二進制文件data9.dat,該文件中存放了不超過100個的若干字符。編寫一個程序,將該文件中可能的字符'A'替換成字符'#',可能的字符'B'替換成字符'*'。補充例題9設D盤根目錄下有一個二進制文件data9.dat,101C語言程序設計姚望舒計算機科學與技術學院蘇州大學C語言程序設計姚望舒102第10章對文件的輸入輸出10.1C文件的有關基本知識10.2打開與關閉文件10.3順序讀寫數據文件10.4隨機讀寫數據文件10.5文件讀寫的出錯檢測第10章對文件的輸入輸出10.1C文件的有關基本知識10310.1C文件的有關基本知識10.1.1什么是文件10.1.2文件名10.1.3文件的分類10.1.4文件緩沖區10.1.5文件類型指針10.1C文件的有關基本知識10.1.1什么是文件104C語言程序設計第10章對文件的輸入輸出[精]課件105C語言程序設計第10章對文件的輸入輸出[精]課件106C語言程序設計第10章對文件的輸入輸出[精]課件10710.1.1什么是文件輸入輸出是數據傳送的過程,數據如流水一樣從一處流向另一處,因此常將輸入輸出形象地稱為流(stream),即數據流。流表示了信息從源到目的端的流動。輸入操作時,數據從文件流向計算機內存輸出操作時,數據從計算機流向文件“流”是一個傳輸通道,數據可以從運行環境流入程序中,或從程序流至運行環境10.1.1什么是文件輸入輸出是數據傳送的過程,數據如流水10810.1.1什么是文件從C程序的觀點來看,無論程序一次讀寫一個字符,或一行文字,或一個指定的數據區,作為輸入輸出的各種文件或設備都是統一以邏輯數據流的方式出現的。C語言把文件看作是一個字符(或字節)的序列。一個輸入輸出流就是一個字符流或字節(內容為二進制數據)流。10.1.1什么是文件從C程序的觀點來看,無論程序一次讀寫10910.1.1什么是文件C的數據文件由一連串的字符(或字節)組成,而不考慮行的界限,兩行數據間不會自動加分隔符,對文件的存取是以字符(字節)為單位的。輸入輸出數據流的開始和結束僅受程序控制而不受物理符號(如回車換行符)控制,這就增加了處理的靈活性。這種文件稱為流式文件。10.1.1什么是文件C的數據文件由一連串的字符(或字節)11010.1.2文件名文件要有一個唯一的文件標識,以便用戶識別和引用。文件標識包括三部分:(1)文件路徑(2)文件名主干(3)文件后綴10.1.2文件名文件要有一個唯一的文件標識,以便用戶識別11110.1.2文件名文件路徑表示文件在外部存儲設備中的位置。如:D:\CC\temp\file1.dat表示file1.dat文件存放在D盤中的CC目錄下的temp子目錄下面文件路徑文件名主干文件后綴10.1.2文件名文件路徑表示文件在外部存儲設備中的位置。11210.1.2文件名文件路徑表示文件在外部存儲設備中的位置。如:D:\CC\temp\file1.dat表示file1.dat文件存放在D盤中的CC目錄下的temp子目錄下面文件名10.1.2文件名文件路徑表示文件在外部存儲設備中的位置。11310.1.2文件名文件路徑表示文件在外部存儲設備中的位置。如:D:\CC\temp\file1.dat表示file1.dat文件存放在D盤中的CC目錄下的temp子目錄下面命名規則遵循標識符的命名規則10.1.2文件名文件路徑表示文件在外部存儲設備中的位置。11410.1.2文件名文件路徑表示文件在外部存儲設備中的位置。如:D:\CC\temp\file1.dat表示file1.dat文件存放在D盤中的CC目錄下的temp子目錄下面一般不超過3個字母(doc、txt、dat、c、cpp、obj、exe、ppt、bmp等)10.1.2文件名文件路徑表示文件在外部存儲設備中的位置。11510.1.3文件的分類根據數據的組織形式,數據文件可分為ASCII文件和二進制文件。數據在內存中是以二進制形式存儲的,如果不加轉換地輸出到外存,就是二進制文件如果要求在外存上以ASCII代碼形式存儲,則需要在存儲前進行轉換ASCII文件又稱文本文件,每一個字節放一個字符的ASCII代碼10.1.3文件的分類根據數據的組織形式,數據文件可分為A11610.1.3文件的分類字符一律以ASCII形式存儲數值型數據既可以用ASCII形式存儲,也可以用二進制形式存儲如有整數10000,如果用ASCII碼形式輸出到磁盤,則在磁盤中占5個字節(每一個字符占一個字節),而用二進制形式輸出,則在磁盤上只占4個字節(用VC++C時)10.1.3文件的分類字符一律以ASCII形式存儲11710.1.3文件的分類(1)(0)(0)(0)(0)ASCII形式二進制形式(10000)10.1.3文件的分類(1)(0)(0)(0)(0)ASC11810.1.4文件緩沖區ANSIC標準采用“緩沖文件系統”處理數據文件所謂緩沖文件系統是指系統自動地在內存區為程序中每一個正在使用的文件開辟一個文件緩沖區10.1.4文件緩沖區ANSIC標準采用“緩沖文件系統”11910.1.4文件緩沖區從內存向磁盤輸出數據必須先送到內存中的緩沖區,裝滿緩沖區后才一起送到磁盤去如果從磁盤向計算機讀入數據,則一次從磁盤文件將一批數據輸入到內存緩沖區(充滿緩沖區),然后再從緩沖區逐個地將數據送到程序數據區(給程序變量)10.1.4文件緩沖區從內存向磁盤輸出數據必須先送到內存中12010.1.4文件緩沖區程序數據區輸出文件緩沖區輸入文件緩沖區磁盤從內存向磁盤輸出數據裝滿緩沖區10.1.4文件緩沖區程序數據區輸出文件緩沖區輸入文件緩沖12110.1.4文件緩沖區程序數據區輸出文件緩沖區輸入文件緩沖區磁盤從磁盤向計算機讀入數據充滿緩沖區10.1.4文件緩沖區程序數據區輸出文件緩沖區輸入文件緩沖12210.1.5文件類型指針緩沖文件系統中,關鍵的概念是“文件類型指針”,簡稱“文件指針”每個被使用的文件都在內存中開辟一個相應的文件信息區,用來存放文件的有關信息(如文件的名字、文件狀態及文件當前位置等)這些信息是保存在一個結構體變量中的。該結構體類型是由系統聲明的,取名為FILE10.1.5文件類型指針緩沖文件系統中,關鍵的概念是“文12310.1.5文件類型指針聲明FILE結構體類型的信息包含在頭文件“stdio.h”中一般設置一個指向FILE類型變量的指針變量,然后通過它來引用這些FILE類型變量10.1.5文件類型指針聲明FILE結構體類型的信息包含12410.1.5文件類型指針FILE
*fp1,*fp2,*fp3;文件f1的文件信息區fp1文件f2的文件信息區fp2文件f3的文件信息區fp310.1.5文件類型指針FILE*fp1,*fp2,*12510.2打開與關閉文件10.2.1用fopen函數打開數據文件10.2.2用fclose函數關閉數據文件10.2打開與關閉文件10.2.1用fopen函數打開數12610.2.1用fopen函數打開數據文件對文件讀寫之前應該“打開”該文件,在使用結束之后應“關閉”該文件。所謂“打開”是指為文件建立相應的信息區(用來存放有關文件的信息)和文件緩沖區(用來暫時存放輸入輸出的數據)。10.2.1用fopen函數打開數據文件對文件讀寫之前應該12710.2.1用fopen函數打開數據文件在編寫程序時,在打開文件的同時,一般都指定一個指針變量指向該文件,也就是建立起指針變量與文件之間的聯系,這樣就可以通過該指針變量對文件進行讀寫所謂“關閉”是指撤銷文件信息區和文件緩沖區10.2.1用fopen函數打開數據文件在編寫程序時,在打12810.2.1用fopen函數打開數據文件fopen函數的調用方式為:FILE*fopen(文件名,使用文件方式);例如:
fopen(“a1”,”r”);表示要打開名為“a1”的文件,使用文件方式為“讀入”fopen函數的返回值是指向a1文件的指針10.2.1用fopen函數打開數據文件fopen函數的調12910.2.1用fopen函數打開數據文件通常將fopen函數的返回值賦給一個指向文件的指針變量。如:FILE*fp;fp=fopen(“a1”,”r”);fp和文件a1相聯系,fp指向了a1文件a1:有兩種形式文件名:表示文件在工程路徑絕對路徑:絕對路徑+文件名10.2.1用fopen函數打開數據文件通常將fopen函13010.2.1用fopen函數打開數據文件在打開一個文件時,通知編譯系統以下3個信息:①需要訪問的文件的名字②使用文件的方式(“讀”還是“寫”等)③讓哪一個指針變量指向被打開的文件使用文件方式參見教材表10.1。10.2.1用fopen函數打開數據文件在打開一個文件時,131說明:(1)用“r”方式打開的文件只能用于向計算機輸入而不能用作向該文件輸出數據,而且該文件應該已經存在,并存有數據,這樣程序才能從文件中讀數據。不能用“r”方式打開一個并不存在的文件,否則出錯。說明:132說明:(2)用“w”方式打開的文件只能用于向該文件寫數據(即輸出文件),而不能用來向計算機輸入。如果原來不存在該文件,則在打開文件前新建立一個以指定的名字命名的文件。如果原來已存在一個以該文件名命名的文件,則在打開文件前先將該文件刪去,然后重新建立一個新文件。說明:133說明:(3)如果希望向文件末尾添加新的數據(不希望刪除原有數據),則應該用“a”方式打開但此時應保證該文件已存在;否則將得到出錯信息。打開文件時,文件讀寫標記移到文件末尾說明:134說明:(4)用r+、w+、a+方式打開的文件既可以用來輸入數據,也可以用來輸出數據。用r+方式時該文件應該已經存在。用w+方式則新建立一個文件,先向此文件寫數據,然后可以讀此文件中的數據。用a+方式打開的文件,原來的文件不被刪去,文件讀寫位置標記移到文件末尾,可以添加,也可以讀。說明:135說明:(5)如果打開失敗,fopen函數將會帶回一個出錯信息。fopen函數將帶回一個空指針值NULL常用下面的方法打開一個文件:if((fp=fopen(“file1”,’r″))==NULL)
{printf(“cannotopenthisfile\n”);exit(0);
}終止正在執行的程序說明:終止正在執行的程序136說明:(6)C標準建議用表10.1列出的文件使用方式打開文本文件或二進制文件,但目前使用的有些C編譯系統可能不完全提供所有這些功能說明:137說明:(7)計算機輸從ASCII文件讀入字符時,遇到回車換行符,系統把它轉換為一個換行符,在輸出時把換行符轉換成為回車和換行兩個字符。在用二進制文件時,不進行這種轉換,在內存中的數據形式與輸出到外部文件中的數據形式完全一致,一一對應。說明:138說明:(8)程序中可以使用3個標準的流文件:標準輸入流、標準輸出流、標準出錯輸出流。系統已對這3個文件指定了與終端的對應關系標準輸入流是從終端的輸入標準輸出流是向終端的輸出標準出錯輸出流是當程序出錯時將出錯信息發送到終端說明:139程序開始運行時系統自動打開這3個標準流文件。因此,程序編寫者不需要在程序中用fopen函數打開它們。所以以前我們用到的從終端輸入或輸出到終端都不需要打開終端文件。程序開始運行時系統自動打開這3個標準流文件。因此,程序編寫者14010.2.2用fclose函數關閉數據文件關閉文件用fclose函數。fclose函數調用的一般形式為fclose(文件指針);例如:
fclose(fp);如果不關閉文件將會丟失數據。10.2.2用fclose函數關閉數據文件關閉文件用fcl14110.3順序讀寫數據文件在順序寫時,先寫入的數據存放在文件中前面,后寫入的數據存放在文件中后面在順序讀時,先讀文件中前面的數據,后讀文件中后面的數據對順序讀寫來說,對文件讀寫數據的順序和數據在文件中的物理順序是一致的順序讀寫需要用庫函數實現10.3順序讀寫數據文件在順序寫時,先寫入的數據存放在文件14210.3順序讀寫數據文件10.3.1怎樣向文件讀寫字符10.3.2怎樣向文件讀寫一個字符串10.3.3用格式化的方式讀寫文件10.3.4用二進制方式向文件讀寫一組數據10.3順序讀寫數據文件10.3.1怎樣向文件讀寫字符14310.3.1怎樣向文件讀寫字符讀寫一個字符的函數10.3.1怎樣向文件讀寫字符讀寫一個字符的函數144
例10.1從鍵盤輸入一些字符,逐個把它們送到磁盤上去,直到用戶輸入一個“#”為止。
解題思路:用fgetc函數從鍵盤逐個輸入字符,然后用fputc函數寫到磁盤文件即可。例10.1從鍵盤輸入一些字符,逐個把它們送到磁盤上去,145#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;charch,filename[10];printf("請輸入所用的文件名:");scanf("%s",filename);if((fp=fopen(filename,“w”))==NULL) {printf("無法打開此文件\n");exit(0);}ch=getchar();接收最后輸入的回車符輸入文件名只寫用exit函數時加#include<stdio.h>接收最后輸入的回車符輸入146printf(“請輸入一個字符串(以#結束):");ch=getchar();while(ch!=‘#’) {fputc(ch,fp);putchar(ch); ch=getchar(); }
fclose(fp);putchar(‘\n’);return0;}printf(“請輸入一個字符串(以#結束):");147
例10.2將一個磁盤文件中的信息復制到另一個磁盤文件中。今要求將上例建立的file1.dat文件中的內容復制到另一個磁盤文件file2.dat中。解題思路:處理此問題的算法是:從file1.dat文件中逐個讀入字符,然后逐個輸出到file2.dat中。例10.2將一個磁盤文件中的信息復制到另一個磁盤文件中148#include<stdio.h>#include<stdlib.h>intmain(){FILE*in,*out;charch,infile[10],outfile[10];printf("輸入讀入文件的名字:");scanf("%s",infile);printf("輸入輸出文件的名字:");scanf(“%s”,outfile);if((in=fopen(infile,“r”))==NULL){printf("無法打開此文件\n");exit(0);}if((out=fopen(outfile,“w”))==NULL){printf("無法打開此文件\n");exit(0);}改為rb和wb,則復制一個二進制文件改為rb和wb,則復制一個二進制文件#include<stdio.h>改為rb和wb,則復制一149while(!feof(in)){ch=fgetc(in);
fputc(ch,out);putchar(ch);}putchar(‘\n’);fclose(in);fclose(out);return0;}檢查當前讀寫位置是否移到文件末尾while(!feof(in))檢查當前讀寫位置150feof()函數功能:用于判斷文件讀取是否結束,如果已經讀到文件結束處,這時,再進行讀取操作時,feof()函數非0,否則返回0.//錯誤程序charc;
while(!feof(fp))
{
c=fgetc(fp);
printf("%c\n",c);
}//正確程序charc;
c=fgetc(fp);
while(!feof(fp))
{
printf("%c\n",c);
c=fgetc(fp);
}feof()函數功能://錯誤程序//正確程序15110.3.2怎樣向文件讀寫一個字符串讀寫一個字符串的函數10.3.2怎樣向文件讀寫一個字符串讀寫一個字符串的函數152說明:fgets函數的函數原型為:char*fgets(char*str,intn,FILE*fp);其作用是從文件讀入一個字符串調用時可以寫成:fgets(str,n,fp);說明:153說明:fgets(str,n,fp);中n是要求得到的字符個數,但實際上只讀n-1個字符,然后在最后加一個’\0’字符,這樣得到的字符串共有n個字符,把它們放到字符數組str中如果在讀完n-1個字符之前遇到換行符“\n”或文件結束符EOF,讀入即結束,但將所遇到的換行符“\n”也作為一個字符讀入執行fgets成功,返回str數組首地址,如果一開始就遇到文件尾或讀數據錯,返回NULL說明:154說明:fputs函數的函數原型為:intfputs(char*str,FILE*fp);str指向的字符串輸出到fp所指向的文件中調用時可以寫成:fputs(″China”,fp);fputs函數中第一個參數可以是字符串常量、字符數組名或字符型指針字符串末尾的′\0′不輸出,也不自動添加換行符號。輸出成功,函數值為0;失敗,函數值為EOF說明:155
例10.3從鍵盤讀入若干個字符串,對它們按字母大小的順序排序,然后把排好序的字符串送到磁盤文件中保存。解題思路:為解決問題,可分為三個步驟:從鍵盤讀入n個字符串,存放在一個二維字符數組中,每一個一維數組存放一個字符串;對字符數組中的n個字符串按字母順序排序,排好序的字符串仍存放在字符數組中;將字符數組中的字符串順序輸出。例10.3從鍵盤讀入若干個字符串,對它們按字母大小的順156#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){FILE*fp;charstr[3][10],temp[10];inti,j,k,n=3;printf(“Enterstrings:\n”);for(i=0;i<n;i++)gets(str[i]);#include<stdio.h>157for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++) if(strcmp(str[k],str[j])>0)k=j;if(k!=i) {strcpy(temp,str[i]); strcpy(str[i],str[k]); strcpy(str[k],temp);}}for(i=0;i<n-1;i++)158if((fp=fopen(“D:\\CC\\string.dat”,“w”))==NULL){printf("can'topenfile!\n");exit(0);}printf("\nThenewsequence:\n");for(i=0;i<n;i++) {fputs(str[i],fp);fputs(“\n”,fp); printf(“%s\n”,str[i]);} fclose(fp);return0;}人為地輸出一個’\n’if((fp=fopen(“D:\\CC\\stri159思考:從文件string.dat中讀回字符串,并在屏幕上顯示,應如何編寫程序?思考:160#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;charstr[3][10];inti=0;if((fp=fopen(“D:\\CC\\string.dat”,“r”))==NULL){printf("can'topenfile!\n");exit(0);}while(fgets(str[i],10,fp)!=NULL){printf("%s",str[i]);i++;}fclose(fp);return0;}不用人為地輸出’\n’#include<stdio.h>不用人為地輸出’\n’16110.3.3
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 管理創新方法試題及答案
- 貴州中考語文答案及試題
- 防火培訓試題及答案
- 小院經濟面試題及答案
- 西方國家的電力政策與國際關系試題及答案
- 現代文學小說主題應用題集
- 項目管理中的網絡安全策略試題及答案
- 機電工程流體控制試題匯編
- 軟件設計中的用戶角色分配與試題答案
- 探討2025年機電工程的國際化趨勢試題及答案
- 機電工程設備調試試題及答案
- 2025年《安全生產月》活動實施方案 (2份)-61
- 小升初諺語試題及答案
- 福建百校聯考2025屆高三5月高考押題卷-英語試卷(含答案)
- 項目一 動力電池課件 任務4 動力電池性能檢測
- 酒店管理職業素養核心要素
- 裝修陪跑服務合同協議
- 醫院收費室筆試題及答案
- 2025年浙江寧波市余姚市糧食收儲有限公司招聘筆試參考題庫附帶答案詳解
- 2025年高考語文作文預測52篇(含范文)
- 2025屆高考政治一輪復習:統編版選擇性必修3《邏輯與思維》知識點考點復習提綱
評論
0/150
提交評論