:本文僅供初學者參閱,解惑
- 在C程式中:
與程式代碼外的資料(檔案)打交道,我們使用到流(stream)這個概念,實作行程的虛擬記憶體與檔案之間的資料交換,
——檔案流:C標準庫提供了FILE(之所以命名為FILE,因為linux將所有機制都視為檔案) ,FILE物件是一個包含了管理流所需的所有資訊的結構,包括緩沖區資訊、各種標記(如檔案結束標記和錯誤標記)以及用于實際I/O的文 件描述符等,
——輸入流,輸入流:資料從檔案傳送到記憶體的叫輸入流,資料從記憶體傳送到檔案的叫輸出流,
——打開檔案:FILE物件通過呼叫fopen函式創建的,如: FILE *fp, fp=fopen("filename","r"), 表示以只讀的方式建立與filename相關的檔案流;filename為當前目錄下的相對路徑名,r代表可讀(打開檔案的模式),
一:讀取
1:對一些有規范格式檔案的讀取,可使用標準庫stdio.h下的fscanf函式,
函式原型為:int fscanf(FILE * stream, const char * format, [argument...])
如讀取檔案data.txt(資料格式相對規范)

代碼實作讀取:
//test.c //檔案讀取 #include<stdio.h> int main() { //1:創建檔案流,檔案指標名=fopen(檔案名,使用檔案方式)打開失敗則回傳NULL; FILE *fp=fopen("./data.txt","r"); //以data.txt檔案為例 //2:檢測檔案是否打開成功; if(!fp){ printf("打開失敗!\n"); return -1; //回傳例外 } //3: int num; //用來儲存一個整型資料 char name[10], place[10]; //用來儲存兩個字串資料 //抽象理解: //理解檔案位置含義:其表示已打開檔案當前可讀寫字符的位置,其表示為一個到檔案頭的整數; //fscanf在讀取資料時可以這樣理解:檔案被打開后,它就成了一個無序位元組流(水流),其會通過一個管道,流向被讀取的一端; //了解fscanf后知道,其遇到空格字符(空格,制表符),換行符,就會停止,這里的停止我們可以理解為: //停下來為檔案中兩個不相關的資料塊做一個分隔的操作,剛好適應了我們一般將空字符(包括換行符)作為兩個資料之間的分隔的行為; //我們只需理解管道的兩端 //流進管道的一端的位置,就是檔案的位置,表示已被讀到的位置, //流出管道一端,就是行程用來讀取資料的一端,其可以對管道中已經做區分的資料進行讀取, //4:讀取: fscanf(fp,"%d%s%s",&num, name,place); //fscanf對流的格式化讀取, //注1:fscanf(fp,"%da%s%s",&num,name,place); 可以實作對資料:1a小剛 河南;的準確讀取,表示兩個資料之間以a為界, //注2:因為流是指標的性質,所以函式是將各資料塊的首地址交給對應引數,所以num需進行&取地址操作, //注3:因為name,place本身已表達地址,所以不用改變; fscanf(fp,"\n"); //\n為控制字符,此時檔案的位置到了第二行的開始; //接著進行操作:fscanf(fp,"%d%s%s",&num, name,place);就可以繼續讀取第二行 //所以我們常常只需利用一個while陳述句就可以將整個檔案讀取到一個資料結構(行程)中 /* while(!feof(fp)) //feof()檢測一個檔案是否結束,即到達檔案尾,若結束,則回傳非0值,否則回傳0 { fscanf(fp,"%d%s%s\n",&num, name,place); } */ //檢測讀取結果 printf("%d %s %s\n",num, name, place); //關閉流 fclose(fp); return 0; }
程式運行結果:

2:從檔案中讀取整行資料(標準庫stdio.h下的fgets)
函式原型:char *fgets(char *str, int n, FILE *stream);
其從指定的流 stream 讀取一行,并把它存盤在 str 所指向的字串內,當讀取 (n-1) 個字符時,或者讀取到換行符時,或者到達檔案末尾時,它會停止,遇到空格不停止;
例從檔案中讀取一行資料:

代碼實作:
//test3.c //行讀取檔案資料 #include<stdio.h> #define maxlen 30 int main() { //創建檔案流 FILE *fp=fopen("./data.txt","r"); //2:檢測檔案是否打開成功; if(!fp){ printf("打開失敗!\n"); return -1; //回傳例外 } char str[maxlen];//緩沖區,用來儲存資料 //從檔案中讀取一行資料,儲存到str開始的地址,最大長度為maxlen,然后下次讀取從下行開始 //如果該行的資料長于maxlen-1,則只能回傳一個不完整的行,并下次呼叫時從該處開始 fgets(str,maxlen,fp); //檢測結果 printf("%s\n",str); //關閉流 fclose(fp); return 0; }
運行結果:

二:保存
1:保存與讀取往往相關聯,保存格式決定了你讀取的方式,使用函式fprintf可以進行指定格式的保存:
函式原型為:int fprintf( FILE *stream, const char *format, [ argument ]...)
假設保存一個人的個人資訊到檔案中:
/*test2.c */ //資料保存 #include<stdio.h> int main() { //例一個人的資訊 int num=1; char name[10]="小明"; char place[10]="河南"; //建立與檔案的流 FILE *fp=fopen("./data.txt","w"); //2:檢測檔案是否打開成功; if(!fp){ printf("打開失敗!\n"); return -1; //回傳例外 } //將資料格式化輸出到指定檔案流,int fprintf( FILE *stream, const char *format, [ argument ]...) //注:此函式,是將format字串寫入到指定輸出流中,format包括空格字符,非空格字符,說明符之中的一個或多個,如:fprintf(fp," "); 就是將空格輸入到流中, //可理解為行程借助流將資料列印(fprintf)到了檔案中; //將個人資訊,寫入指定流中,資料間以一個空格分隔,最后還寫入換行符(控制字符), fprintf(fp,"%d %s %s\n",num, name,place); //所以常常只要利用一個while陳述句就可以將講一個表(鏈表,順序表)按指定行格式寫入輸出流中 /* while(!feof(fp)) //feof()檢測一個檔案是否結束,即到達檔案尾,若結束,則回傳非0值,否則回傳0 { fprintf(fp,"%d %s %s\n",num, name,place); } */ //關閉流 fclose(fp); return 0; }
運行結果:

2:寫一個字串到流中(fputs),函式原型:int fputs(const char *str, FILE *stream);
例:
//test4.c //保存字串 #include<stdio.h> int main() { //1:創建檔案流,檔案指標名=fopen(檔案名,使用檔案方式)打開失敗則回傳NULL; FILE *fp=fopen("./data.txt","a"); //以data.txt檔案為例,a表示追加 //2:檢測檔案是否打開成功; if(!fp){ printf("打開失敗!\n"); return -1; //回傳例外 } //string char string[20]="Facing the world"; //write string to the fstream fputs(string,fp); //關閉流 fclose(fp); return 0; }
運行結果:

淺談c++:
在c++中我們可以使用運算子<<, >>來進行流的讀寫操作,更加的方便和易于理解;
具體參考下列實體:
1:讀取所示資料:

代碼實作:
//c++檔案讀取 #include<iostream> //輸入輸出流 #include<fstream> //檔案流 //using namespace std; //若使用該宣告,則可以不用在使用的每個標準庫的成員前加std:: int main() { //序號,年齡,年; int num, age, year; //姓名,地址 char name[20], place[20]; //c++的檔案流,ifstream為輸入檔案流 std::ifstream fp; //open為ifstream的成員函式,功能為打開檔案,并將它與流關聯 fp.open("./data.txt",std::ios::in); //ios::in表示讀流的方式,表示打開模式, //成員函式is_open檢查流是否有關聯檔案,即打開成功與否,成功回傳true,失敗回傳false if(!fp.is_open()){ std::cout<<"打開檔案失敗!!\n"; return 1; // 回傳例外; } //讀取資料 fp>>num>>year>>age>>name>>place; //使用運算子>>,將資料傳輸到對應的變數中 //檢測 std::cout<<num<<":"<<name<<",age:"<<age<<",year:"<<year<<",live in:"<<place<<"\n"; //cout相當于printf //關閉流 fp.close(); return 0; }
運行結果:

2:往檔案保存資料:
實體:保存一個人的具體資訊到檔案data.txt中

代碼實作:
//c++資料保存 #include<iostream> //輸入輸出流 #include<fstream> //檔案流 //using namespace std; //若使用該宣告,則可以不用在使用的每個標準庫的成員前加std:: int main() { //序號,年齡,年; int num=3; int age=20; int year=1993; //姓名,地址 char name[20]="小龍"; char place[20]="廣元"; //c++的檔案流,ofstream為輸出檔案流 std::ofstream fp; //open為ofstream的成員函式,功能為打開檔案,并將它與流關聯 fp.open("./data.txt",std::ios::app); //ios::app表示每次寫入是都追加到流尾,表示打開模式, //成員函式is_open檢查流是否有關聯檔案,即打開成功與否,成功回傳true,失敗回傳false if(!fp.is_open()){ std::cout<<"打開檔案失敗!!\n"; return 1; // 回傳例外; } //讀取資料 fp<<num<<" "<<year<<" "<<age<<" "<<name<<" "<<place<<"\n"; //使用運算子<<,將各資料傳輸到流所關聯的檔案中 //關閉流 fp.close(); return 0; }
運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/56872.html
標籤:C
上一篇:stm32控制步進電機加減速
