C/C++中的檔案操作(1)

來源:互聯網
上載者:User

前幾天一直用Python做google code jam的練習題,檔案操作很方便。如果用C/C++去做的話,那麼首先要解決的就是檔案操作。於是整理了一下檔案操作的函數用法。先來看看C的檔案操作。

FILE* stream
相關的標頭檔stdio.h,就可以使用與檔案操作相關的資料類型和函數。
檔案的開啟與關閉
首先,定義檔案指標,FILE* f,用fopen(const char* filename,const char* mode)來開啟檔案,用fclose(File* p)來關閉檔案。
檔案的開啟檔案,"r"表示讀,"w"表示寫,"a"表示在檔案末尾追加,然後加上"+"就表示既可以讀又可以寫。
檔案還可以按text或binary的模式開啟,可以在mode裡面加上"t"或"b"。預設情況下是按text模式開啟。
需要注意的是,對於"r"模式,檔案必須存在,否則傳回值NULL;而對於"w"和"a",如果檔案不存在,則會建立新的檔案。

檔案內容的讀取與輸出內容到檔案
int feof(File* p) 判斷是否到檔案尾,否的情況下才能繼續往下讀。
int fgetc(FILE* p) 讀取一個字元,傳回值是int,對應的ascii值。
char* fgets(char* str,int num, FILE* p) 讀取指定數目為num的字元到str中。這個函數有傳回值,如果讀取成功,傳回值與str地址一樣,不成功則為NULL,所以讀取之後還是先判斷一下傳回值是否為NULL。
size_t fread(void* ptr,size_t size,size_t count,FILE* p) 竟然有四個參數,ptr指向的空間用來存放讀到的內容,size表示讀取的單元的byte數,count表示要讀取的單元數,傳回值表示實際讀到的單元數。

獲得檔案的長度
// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);

int fscanf(FILE* p,const char* format,...) format,與printf相同的一個參數,
[=%[*][width][modifiers]type]
* 表示
width 讀取一次的長度
modifiers可以是
h,表示short int或short unsigned int;
l表示long int或long unsigned int或double,
L表示long double。
type表示值的類型,可以用的類型有
%c 讀取單個字元, char c;fscanf(p,"%c",&c);
%d 讀取整數,可以處理前面的+-,int d;fscanf(p,"%d",&d);
%e或%E 讀取浮點數,可以處理科學記號標記法,float f;fscanf(p,"%e",&f);
%f 讀取浮點數 float f;fscanf(p,"%f",&f);
%g或%G 讀取浮點數 float f;fscanf(p,"%g",&f);
%s 讀取字串 char str[80];fscanf(p,"%s",str); 限定width,避免溢出
%u 讀取無符號數 unsigned int u;fscanf(p,"%u",&u);
%o 讀取8進位數 int o;fscanf(p,"%o",&o);
%x或%X 讀取16進位數 int x;fscanf(p,"%x",&x);

輸出內容到檔案
int fputc(int c,FILE* p) 寫一個字元到檔案,第一個參數是int類型;
int fputs(const char* str,FILE* p) 將字串str寫到檔案,與fgtes不同的是,不需要指定長度;
size_t fwrite(const void* ptr,size_t size,size_t count,FILE* p) 與fread對應,傳回值為成功寫入的元素數,應該與count相等,否則就是出錯了。
int fprintf(FILE*p,const char* format,...)與printf對應的,將內容列印到檔案。這裡的format與fscanf的format有些不同,
%[flags][width][.precision][length]specifier
flags,
- 要求輸出靠左對齊,預設是靠右對齊
+ 對正數也輸出符號+
空格 在沒有符號的時候輸出空白,對於正數,不輸出+則輸出空格,在有+的flag時空格會忽略掉。
# 在16或8進位輸出時在前面加上0x
0 空白處填充0
width,
number 用一個數字表示輸出的元素所佔位寬
precision,
.number 用一個數字表示需要輸出幾位小數
length,
h,l,L與fscanf類似,l在用於wchar_t字元或字串輸出時
specifier,
與fscanf相比,多了一個p,輸出地址,%,兩個%一起才表示輸出一個%。

輸入輸出重新導向
可以把標準輸入輸出重新導向到檔案,
比如一般從stdin讀取輸入,用的讀取函數是gets,read,scanf等,當想從檔案讀取輸入的時候,不是將這些函數變成fgets,fread,fscanf,而是使用輸入輸出重新導向。
freopen(const char* filename,const char* mode, FILE* stream), 將stream重新導向到filename對應的檔案。失敗則返回NULL。
重新導向標準輸入到檔案,之後就是從檔案讀取輸入了。
freopen("input.txt","r",stdin);
重新導向標準輸出到檔案,之後就把內容輸出到檔案了。
freopen("output.txt","r",stdout);

error
void perror(const char* str),報錯,輸出給定的錯誤提示資訊,並將全域的errno轉換成對應錯誤資訊輸出。
int ferror(FILE* p), 檢查檔案是否處於異常狀態。

接下來會繼續整理C++的檔案操作。

整理過程只是自己的學習過程。雖然簡單,但也需要積累。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.