C/C++文件操作

第一種方法:
使用fstresm頭文件(sream的子類):
一.打開文件
以“讀/寫”方式打開文件使用fstream;
以“讀”方式打開文件使用ifstream;
以“寫”方式打開文件使用ofstream;
打開文件的方式在類ios(是所有流失I/O類的基類)中定義,常用的值如下:
ios::app //以追加方式打開文件
ios::ate //文件打開後定位到文件尾,ios::app就包含有此屬性
ios::binary //以二進制方式打開文件, 缺省的方式就是文本方式
ios::in //以輸入方式打開文件
ios::out //以輸出方式打開文件
ios::nocreate //不建立文件,當文件不存在時打開失敗
ios::noreplace //不覆蓋文件,所以打開文件時如果文件存在則打開失敗
ios::trunc //如果文件存在,把文件長度設爲0
可以使用“|(或)”把以上屬性連接起來。

一個讀取文本文件的例子:

#include<fstream>
#include<iostream>
using namespace std;
void main()
{
ifstream fout;
char ch;
fout.open("e:\\1.txt",ios::in)//以“讀”方式打開文件,ios::in也可不用指定,默認就是。
fout.get(ch);
cout<<ch;//輸出文件的第一個字符
cin.get();
}

二.移動指針
使用seekg可以使讀指針定位到指定位置;
使用seekp可以使寫指針定位到指定位置。
函數原型:
ostream& seekp( streampos pos );
ostream& seekp( streamoff off, ios::seek_dir dir );
istream& seekg( streampos pos );
istream& seekg( streamoff off, ios::seek_dir dir );
參數
pos:新的文件流指針位置值
off:需要偏移的值
dir:搜索的起始位置
dir參數用於對文件流指針的定位操作上,代表搜索的起始位置
使用上面代碼的參數,例:
fout.seekg(5,ios::beg);//從文件起始位置向後偏移5個字符
第二個參數有如下:
ios::beg:文件流的起始位置
ios::cur:文件流的當前位置
ios::end:文件流的結束位置

tellg()、tellp()可以分別返回讀指針、寫指針的位置。
例:
cout<

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void main()
{
ifstream fin;
ofstream fout;
string finname="e:\\1.txt",foutname="e:\\2.txt";
fin.open(finname,ios::in);
fout.open(foutname,ios::out);

}

第二種方法:
使用FILE*,(需要加入頭文件stdio.h):
例:

#include<iostream>
#include<stdio.h>
using namespace std;
void main()
{
FILE *fp;
fopen_s(&fp,"e:\\1.txt","r");//使文件指針指向“e:\\1.txt”
char ch;
ch=fgetc(fp);//讀取一個字符到ch
cout<<ch<<endl;//輸出ch
cin.get();
}

一. 打開文件
fopen_s()用來打開文件,在vs中使用,因爲它比fopen更安全,打開文件成功則返回0.
函數原型:
errno_t fopen_s( FILE** pFile, const char *filename, const char *mode );
pFile :指向用於接收打開文件的指針。
filename :要打開的文件。
mode:打開模式,有以下幾種方法:
“rt”      只讀打開一個文本文件,只允許讀數據
“wt”      只寫打開或建立一個文本文件,只允許寫數據
“at”      追加打開一個文本文件,並在文件末尾寫數據
“rb”      只讀打開一個二進制文件,只允許讀數據
“wb”       只寫打開或建立一個二進制文件,只允許寫數據
“ab”       追加打開一個二進制文件,並在文件末尾寫數據
“rt+”      讀寫打開一個文本文件,允許讀和寫
“wt+”      讀寫打開或建立一個文本文件,允許讀寫
“at+”      讀寫打開一個文本文件,允許讀,或在文件末追加數 據
“rb+”      讀寫打開一個二進制文件,允許讀和寫
“wb+”      讀寫打開或建立一個二進制文件,允許讀和寫
“ab+”      讀寫打開一個二進制文件,允許讀,或在文件末追加數據
r(read): 讀
w(write): 寫
a(append): 追加
t(text): 文本文件,可省略不寫
b(banary): 二進制文件
+: 讀和寫

用“r”打開一個文件時,該文件必須已經存在, 且只能從該文件讀出。
用“w”打開的文件只能向該文件寫入。 若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經存在,則將該文件刪去,重建一個新文件。
二. 讀寫文件
·字符讀寫函數 :fgetc和fputc
·字符串讀寫函數:fgets和fputs
·數據塊讀寫函數:fread和fwrite
·格式化讀寫函數:fscanf和fprinf

1.fgetc()每次讀取一個字符,例:ch=fgetc(fp);
fputc()每次寫入一個字符。
2.fgets()讀取指定長度字符,例:char ch[10];fgets(ch,10,fp);
第一個參數指定讀取出的儲存位置;
第二個參數指定讀取的字符數,若設爲n,則讀取n-1個字符;
第三個參數指定被讀取的文件。
fputs()是寫函數,使用方法同上。
3.fread()讀取數據塊,函數原型:
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
buffer
用於接收數據的內存地址
size
要讀的每個數據項的字節數,單位是字節
count
要讀count個數據項,每個數據項size個字節.
stream
輸入流
讀取總字節數=buffer*size;

fwrite原型:
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
返回值:返回實際寫入的數據塊數目
(1)buffer:是一個指針,對fwrite來說,是要獲取數據的地址;
(2)size:要寫入內容的單字節數;
(3)count:要進行寫入size字節的數據項的個數;
(4)stream:目標文件指針;
(5)返回實際寫入的數據項個數count。
說明:寫入到文件的哪裏? 這個與文件的打開模式有關,如果是w+,則是從file pointer指向的地址開始寫,替換掉之後的內容,文件的長度可以不變,stream的位置移動count個數;如果是a+,則從文件的末尾開始添加,文件長度加大。

4.fcanf()
從一個流中執行格式化輸入,fscanf遇到空格和換行時結束,注意空格時也結束。這與fgets有區別,fgets遇到空格不結束。
原型:
int fscanf(FILE*stream, constchar*format, argument…);
FILE *stream:文件指針
char *format:格式字符串
基本參數:
%d:讀入一個十進制整數.
%i :讀入十進制,八進制,十六進制整數,與%d類似,但是在編譯時通過數據前置或後置來區分進制,如加入”0x”則是十六進制,加入”0”則爲八進制。例如串”031”使用%d時會被算作31,但是使用%i時會算作25.
%u:讀入一個無符號十進制整數.
%f %F %g %G : 用來輸入實數,可以用小數形式或指數形式輸入.
%x %X: 讀入十六進制整數.
%o’: 讀入八進制整數.
%s : 讀入一個字符串,遇空字符’\0’結束。
%c : 讀入一個字符。無法讀入空值。空格可以被讀入。
例:fscanf(fp,”%s%d%lf”,a,&b,&c);

fprintf原型:
int fprintf (FILE* stream, const char*format, argument)
FILE*stream:文件指針
const char* format:輸出格式
fprintf( )會根據參數format 字符串來轉換並格式化數據, 然後將結果輸出到參數stream 指定的文件中, 直到出現字符串結束(‘\0’)爲止。

三.關閉文件
fclose()用來關閉文件;
函數原型:
int fclose( FILE *fp );
執行成功則返回0,否則返回EOF(-1)。
例:fclose(fp);//fp是打開文件的指針
四.檢測文件結尾
int feof(FILE *fp);
feof(fp)有兩個返回值:如果遇到文件結束,函數feof(fp)的值爲非零值,否則爲0。
五.讀寫文件出錯檢測函數ferror函數
int ferror(FILE *stream);
在調用各種輸入輸出函數(如 putc.getc.fread.fwrite等)時,如果出現錯誤,除了函數返回值有所反映外,還可以用ferror函數檢查。 它的一般調用形式爲 ferror(fp);如果ferror返回值爲0(假),表示未出錯。如果返回一個非零值,表示出錯。應該注意,對同一個文件 每一次調用輸入輸出函數,均產生一個新的ferror函 數值,因此,應當在調用一個輸入輸出函數後立即檢 查ferror函數的值,否則信息會丟失。在執行fopen函數時,ferror函數的初始值自動置爲0。

六.文件出錯標誌和文件結束標誌置0函數clearerr函數調用格式: clearerr(文件指針);
功能:本函數用於清除出錯標誌和文件結束標誌,使它們爲0值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章