和許多的C++程序一樣,有些人更喜歡用原先的C語言方式處理問題,如果你恰好也是這些人中的一員,就應該學習一下這篇文章。
基本的文件操作有
◆fopen——打開文件,指定文件以怎樣的方式打開(讀/寫)以及類型(二進制/文本)
◆fclose——關閉已經打開的文件
◆fread——讀取文件
◆fwrite——寫文件
◆fseek/fsetpos——將文件指示器轉移到文件中的某一地方
◆ftell/fgetpos——可以告訴你文件指示器所在的位置
文件有兩種基本類型:文本和二進制。在這兩者之中,通常二進制類型是較容易解決的。由於在文本中處理隨機存取並不常用,我們會在本文中重點關注二進制文件的處理。上面列出的操作中的前四項可用於文本文件和隨機存取文件。後面的兩項則僅用於隨機存取。
隨機存取意味著我們可以在文件的任意部分之間進行切換,且可以從中讀寫數據而不需要通讀整篇文件。
二進制文件
二進制文件是任意長度的文件,它保存有從0到0xff(0到255)不等的字節值。這些字節在二進制文件中沒有任何意義,與此不同的是,在文本文件中,值為13就意味著回車,10意味著換行,26意味著文件結束,而讀取文本文件的軟件要能夠解決這些問題。
在現在的術語中,我們將二進制文件稱為包含了字節的字符流,大多數語言傾向於將其理解為字符流而不是文件。重要的部分是數據流本身而不是其來源。在C語言中,你能從文件或數據流方面來考慮數據。或者,你可以將其理解為一組長的數組。通過隨機存取,你可以讀寫數組的任意部分。
例一:
// ex1.c : Defines the entry point for the console application.
//
#include < stdio.h>
#include < string.h>
#include < windows.h>
int FileSuccess(FILE * handle,const char * reason, const char * path) {
OutputDebugString( reason );
OutputDebugString( path );
OutputDebugString(" Result : ");
if (handle==0)
{
OutputDebugString("Failed");
return 0;
}
else
{
OutputDebugString("Suceeded");
return 1;
}
}
int main(int argc, char * argv[])
{
const char * filename="test.txt";
const char * mytext="Once upon a time there were three bears.";
int byteswritten=0;
FILE * ft= fopen(filename, "wb");
if (FileSuccess(ft,"Opening File: ", filename)) {
fwrite(mytext,sizeof(char),strlen(mytext), ft);
fclose( ft );
}
printf("len of mytext = %i ",strlen(mytext));
return 0;
}
這段代碼顯示了一個簡單的打開待寫的二進制文件,文本字符(char*)會寫入該文件。通常你會使用文本文件但是筆者想證明你可以向二進制文件寫入文本。
// ex1.c
#include < stdio.h>
#include < string.h>
int main(int argc, char * argv[])
{
const char * filename="test.txt";
const char * mytext="Once upon a time there were three bears.";
int byteswritten=0;
FILE * ft= fopen(filename, "wb") ;
if (ft) {
fwrite(mytext,sizeof(char),strlen(mytext), ft) ;
fclose( ft ) ;
}
printf("len of mytext = %i ",strlen(mytext)) ;
return 0;
}