用C语言打开文件的几种方式及区别
生活随笔
收集整理的這篇文章主要介紹了
用C语言打开文件的几种方式及区别
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
| r(只讀) | 讀取一個(gè)已經(jīng)存在的文本文件 | 出錯(cuò) |
| w(只寫) | 打開一個(gè)文本文件,輸出數(shù)據(jù),若文件存在則文件長(zhǎng)度清為0,即該文件內(nèi)容會(huì)消失 | 建立新文件 |
| a (追加) | 向文本文件末尾添加數(shù)據(jù),原來文件中的數(shù)據(jù)保留,新的數(shù)據(jù)添加到文件為,原文件EOF保留 | 建立新文件 |
| rb(只讀) | 讀取一個(gè)二進(jìn)制文件 | 出錯(cuò) |
| wb(只寫) | 打開一個(gè)二進(jìn)制文件,輸出數(shù)據(jù),若文件存在則文件長(zhǎng)度清為0,即該文件內(nèi)容會(huì)消失 | 建立新文件 |
| ab (追加) | 向二進(jìn)制文件尾添加數(shù)據(jù) | 建立新文件 |
| r+ (讀寫) | 對(duì)一個(gè)文本文件進(jìn)行讀寫操作 | 出錯(cuò) |
| w+ (讀寫) | 對(duì)一個(gè)文本文件進(jìn)行讀寫操作,若文件存在則文件長(zhǎng)度清為0,即該文件內(nèi)容會(huì)消失 | 建立新文件 |
| a+(讀寫) | 向文本文件末尾添加數(shù)據(jù),原來文件中的數(shù)據(jù)保留,新的數(shù)據(jù)添加到文件尾,原文件EOF不保留 | 建立新文件 |
| rb+ (讀寫) | 讀寫一個(gè)二進(jìn)制文件 | 出錯(cuò) |
| wb+ (讀寫) | 對(duì)一個(gè)二進(jìn)制文件進(jìn)行讀寫操作,若文件存在則文件長(zhǎng)度清為0,即該文件內(nèi)容會(huì)消失 | 建立新文件 |
| ab+(讀寫) | 向二進(jìn)制文件末尾添加數(shù)據(jù),原來文件中的數(shù)據(jù)保留,新的數(shù)據(jù)添加到文件尾 | 建立新文件 |
r+具有讀寫屬性,從文件頭開始寫,保留原文件中沒有被覆蓋的內(nèi)容;
w+也具有讀寫屬性,寫的時(shí)候如果文件存在,會(huì)被清空,從頭開始寫。
先讀后寫先寫后讀的問題
再用C語言對(duì)文件先讀后寫或者先寫后讀時(shí),一定要注意文件指針的位置情況。不然可能導(dǎo)致本該重寫的以追加方式寫入等錯(cuò)誤。
e.g.
The output of the follwing code is supposed to be: (and it is with gcc on linux)num:10 ret:1 num:30 ret:1 ==========++ 10 ## 30 40But instead it completely ignores the overwrite and only moves the filepointer and the output comes out as:num:10 ret:1 num:30 ret:1 ============ 10 20 30 40however if the two lines for the first fscanf and printf are commented, the output becomes:num:20 ret:1 ============ ## 20 30 40 Why? */#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) {FILE* fptr;int num,ret, ch;fptr = fopen("data.txt", "w"); // creating data.txt file: 10\n20\n30\n40\nfor (num = 1; num <= 4; fprintf(fptr, "%d\n", num++ * 10));fclose(fptr);fptr = fopen("data.txt", "r+"); // reopening with r+ // comment the following two lines and overwrite will work!ret = fscanf(fptr, "%d\n", &num); printf("num:%d ret:%d\n", num, ret); - // overwriting 20 (Fails!, file pointer moves with no error and no output)fprintf(fptr, "##"); fflush(fptr);ret = fscanf(fptr, "%d\n", &num); printf("num:%d ret:%d\n", num, ret); fclose(fptr);fptr = fopen("data.txt", "r"); // reopening with rprintf("============\n");while ((ch = fgetc(fptr)) != EOF) putchar(ch); // printing the content of data.txtfclose(fptr);return 0; }當(dāng)文件以r+, w+, 或者 a+ 形式打開后,我們可以讀寫該文件,但是我們讀完文件準(zhǔn)備寫時(shí),文件指針位于文件尾,想要覆蓋輸入,則必須使用文件定位函數(shù),如fsetpos,fseek和rewind等。
比如從頭重新寫:則需要fseek(fp, 0, SEEK_SET);將文件指針返回頭部。
當(dāng)從寫入切換為讀取時(shí),則需要使用fflush清除文件緩存或者使用文件定位函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的用C语言打开文件的几种方式及区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一次性打开计算机任意程序的脚本(C语言)
- 下一篇: C程序多线程同时画圆画方