C/C++文件操作,數據處理
在ANSI C中,對文件的操作分為兩種方式,即流式文件操作和I/O 文件操作,這里我們只介紹流式文件操作。(1)FILE
進行文件操作時,必須在程序一開始就先定義文件指針:FILE *指針類型變量。FILE 在stdio.h中定義如下:typedef struct { int level; unsigned flags; char fd; unsigned char hold; int bsize; unsigned char _FAR *buffer; unsigned char _FAR *curp; unsigned istemp; short token; } FILE;(2)fopen
FILE *fopen(const char *filename,const char *mode);"r"(只讀) 為輸入打開一個文本文件。若指定的文件不存在,則會出錯。
"w"(只寫) 為輸出打開一個文本文件。若文件不存在,系統將用指定名建立一個新文件;若文件已經存在,則將從起始位置重新寫,原有內容被更新
"rb"(只讀) 為輸入打開一個二進制文件。功能與"r"相同。
"wb"(只寫) 為輸出打開一個二進制文件。功能與"w"相同。
"a"(追加) 為追加數據打開一個文本文件。若文件不存在,系統將用指定名建立一個新文件;若文件已經存在,則新數據寫在原有內容之后。
"ab"(追加) 為追加數據打開一個二進制文件。其余功能與"a"相同。
"r+"(讀寫)</span> 為讀/寫打開一個已存在文本文件。既可讀,也可寫,讀寫總是從文件的起始位置開始;更換讀寫操作時不必關閉文件。
"rb+"(讀寫) 為讀/寫打開一個已存在的二進制文件。功能與"r+"相同。可由位置函數設置讀寫的起始位置。
"w+"(讀寫) 為讀/寫建立一個新的文本文件。若文件已存在,原有內容將被更新。
"wb+"(讀寫) 為讀/寫建立一個新的二進制文件。功能與"w+"相同;可由位置函數設置讀寫起始位置。
"a+"(讀寫) 為讀/寫打開一個文本文件。功能與"a"相同,只是在文件尾部添加新數據后,可以從頭開始讀。
"ab+"(讀寫) 為讀/寫打開一個二進制文件。功能與"a+"相同,只是在文件尾部添加新數據之后,可由位置 函數設置開始讀的起始位置。
此函數返回一個FILE 指針,所以申明一個FILE 指針后不用初始化,而是用fopen()來返回一個指針并與一個特定的文件相連,如果成敗,返回NULL。
FILE *fp; if( fp=fopen("A.TXT","r") == NULL) { printf("can't find this file!/n"); exit(0); }(3)fgetc
int fgetc(FILE *stream);從文件指針stream指向的文件中讀取一個字符,讀取一個字節后,光標位置后移一個字節。這個函數的返回值,是返回所讀取的一個字節。如果讀到文件末尾或者讀取出錯時返回EOF。用法如下:
char ch1=fgetc(fp);(4)fgets
char *fgets(char *buf, int bufsize, FILE *stream);buf: 字符型指針,指向用來存儲所得數據的地址。
bufsize: 整型數據,指明buf指向的字符數組的大小。
stream: 文件結構體指針,將要讀取的文件流。
從文件結構體指針stream中讀取數據,每次讀取一行。讀取的數據保存在buf指向的字符數組中,每次最多讀取bufsize-1個字符(第bufsize個字符賦'\0'),如果文件中的該行,不足bufsize個字符,則讀完該行就結束。函數成功將返回buf,失敗或讀到文件結尾返回NULL。因此我們不能直接通過fgets的返回值來判斷函數是否是出錯而終止的,應該借助feof函數或者ferror函數來判斷。
例:如果一個文件的當前位置的文本如下:
Love, I Have
Since you can do it.
如果用fgets(str1,6,file1);去讀取,則執行后str1 = "Love," ,讀取了6-1=5個字符,這個時候再執行fgets(str1,20,file1)則執行后str1 = " I Have\n"。而如果fgets(str1,23,file1);
則執行str1="Love ,I Have",讀取了一行(包括行尾的'\n',并自動加上字符串結束符'\0'),當前文件位置移至下一行,雖然23大于當前行上字符總和,可是不會繼續到下一行。而下一次調用fgets()繼續讀取的時候是從下一行開始讀。
(5)fscanf
int fscanf(FILE *stream, char *format,[argument...]);FILE stream:文件指針;char format:格式字符串(查看其他資料,包括輸入格式、忽略元素、包含元素等);[argument...]:輸入列表。
從一個流、文件(stream)中讀入數據,執行格式化輸入,然后將結果按照格式保存在列表中(可以理解為:將TXT文件中的內容,有針對性地提取出來,并保存在特定的列表、數組中),fscanf遇到空格和換行時結束,注意空格時也結束。這與fgets有區別,fgets遇到空格不結束。
FILE *fp = 0; char tmp[255] = {0}; fp = fopen(argv[1],"r+"); while(EOF != fscanf(fp,"%*[^','],\"%*[^','],%[^','],%*s",tmp)) { sscanf(tmp,"\"%s\"",tmp1); printf("%d\n",atoi(tmp1)); }(6)fprintf
int fprintf(FILE *stream,char *format,[argument]);printf是標準輸出流的輸出函數,用來向屏幕這樣的標準輸出設備輸出,而fprintf則是向文件輸出,將輸出的內容輸出到硬盤上的文件或是相當于文件的設備上。根據指定的format(格式)發送信息(參數)到由stream(流)指定的文件. fprintf()只能和printf()一樣工作. fprintf()的返回值是輸出的字符數,發生錯誤時返回一個負值.
char s[] = "this is a string"; char c = '\n'; stream = fopen( "fprintf.out", "w" ); fprintf( stream, "%s%c", s, c ); fprintf( stream, "%d\n", i ); fprintf( stream, "%f\n", fp );
(7)fwrite
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);buffer:是一個指針,對fwrite來說,是要獲取數據的地址;size:要寫入內容的單字節數;count:要進行寫入size字節的數據項的個數;stream:目標文件指針;返回實際寫入的數據項個數count。向文件寫入一個數據塊,這個函數以二進制形式對文件進行操作,不局限于文本文件。
FILE *stream; struct mystruct s; if ((stream = fopen("TEST.$$$", "wb")) == NULL) /* open file TEST.$$$ */ { fprintf(stderr, "Cannot open output file.\n"); return 1; } s.i = 0; s.cha = 'A'; fwrite(&s, sizeof(s), 1, stream); /* 寫的struct文件*/(8)sscanf
int sscanf(const char *buffer,const char *format,[argument ]...);fscanf是從文件中讀,sscanf是從字符串中讀,scanf是從鍵盤輸入中讀。sscanf會從buffer(一般為字符型數組、字符串)里讀進數據,依照format的格式將數據寫入到argument(一般為字符型數組)里。
sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf); sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); printf("%s\n", buf);(9)getline
ssize_t getline(char **lineptr, size_t *n, FILE *stream);lineptr:指向存放該行字符的指針,如果是NULL,則有系統幫助malloc,請在使用完成后free釋放。n:如果是由系統malloc的指針,請填0。stream:文件描述符。getline()函數會生成一個包含一串從輸入流讀入的字符的字符串,直到一下情況發生會導致生成的此字符串結束。1)到文件結束,2)遇到函數的定界符,3)輸入達到最大限度。
FILE fp; char line = NULL; size_t len = 0; ssize_t read;if(!(fp=fopen("1.txt","r"))) { printf("\nerror on open 1.txt file!\n"); exit(1); } while ((read = getline(&line, &len, fp)) != -1);</pre>
來自:http://blog.csdn.net/look595271601/article/details/16047369
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!