最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中文件操作Error處理的方法示例

 更新時(shí)間:2025年10月15日 08:41:38   作者:煤球王子  
在 C 語言中,ferror() 是一個(gè)內(nèi)置函數(shù),用于在文件操作期間檢查文件是否發(fā)生錯(cuò)誤,它提供了一種簡單的方法,在你的 C 程序中進(jìn)行文件操作時(shí)不會(huì)中斷,本文給大家介紹了C語言中文件操作Error處理的方法,需要的朋友可以參考下

一. C 中的 ferror() 函數(shù)

在 C 語言中,ferror() 是一個(gè)內(nèi)置函數(shù),用于在文件操作期間檢查文件是否發(fā)生錯(cuò)誤。它提供了一種簡單的方法,在你的 C 程序中進(jìn)行文件操作時(shí)不會(huì)中斷。

1.ferror 語法

ferror() 是一個(gè)標(biāo)準(zhǔn)庫函數(shù),定義在頭文件 <stdio.h> 中。

ferror(fptr)

**參數(shù):**  
接收一個(gè)文件流指針作為參數(shù)。

**返回值:**  
- 如果文件有錯(cuò)誤,返回一個(gè)非零值。  
- 否則,返回 0。

**注意:** 要使用 `ferror()` 檢查文件錯(cuò)誤,文件必須先打開。

2.ferror() 的示例

示例 1:寫入數(shù)據(jù)時(shí)檢查錯(cuò)誤

#include <stdio.h>

int main() {
    FILE *fptr = fopen("gfg.txt", "w");

    // 向文件寫入數(shù)據(jù)
    fprintf(fptr, "Hello, GFG!");

    // 寫入后檢查是否有錯(cuò)誤
    if (ferror(fptr) == 0)
        printf("數(shù)據(jù)寫入成功。");
    
    fclose(fptr);
    return 0;
}

輸出:

數(shù)據(jù)寫入成功。

示例 2:讀取數(shù)據(jù)時(shí)檢查錯(cuò)誤

#include <stdio.h>

int main() {
    FILE *fptr = fopen("gfg.txt", "w+");
    fprintf(fptr, "GeeksForGeeks!");

    rewind(fptr);

    char d[14];
    while (fscanf(fptr, "%s", d) != EOF)

    // 讀取后檢查是否有錯(cuò)誤
    if (ferror(fptr) == 0) {
        for (int i = 0; i < sizeof(d); i++) {
            printf("%c", d[i]);
        }
        printf("\n沒有錯(cuò)誤,數(shù)據(jù)讀取成功");
    }

    fclose(fptr);
    return 0;
}

輸出:

GeeksForGeeks!
沒有錯(cuò)誤,數(shù)據(jù)讀取成功

二. C 中的 EOF、getc() 和 feof()

1.什么是 EOF?

在 C 中,EOF 是一個(gè)常量宏,定義在頭文件 <stdio.h> 中,用于表示文件結(jié)束。它被多個(gè)文件讀取函數(shù)使用,比如 fread()、gets()、getc() 等。 EOF 的值是由實(shí)現(xiàn)定義的,但通常是 -1

2.getc() 函數(shù)

getc() 函數(shù)用于從給定的文件流中讀取一個(gè)字符。它是以宏的形式在 <stdio.h> 中實(shí)現(xiàn)的。

語法:

getc(fptr);

#### 參數(shù):
- `fptr`:指向要讀取數(shù)據(jù)的文件流的指針。

#### 返回值:
- 返回從文件流中讀取的字符。
- 如果發(fā)生錯(cuò)誤或到達(dá)文件末尾,返回 `EOF`。

3.feof() 函數(shù)

feof() 函數(shù)用于檢查文件指針是否指向文件末尾。如果到達(dá)文件末尾,它返回一個(gè)非零值;否則返回 0。

語法:

feof(fptr);

#### 參數(shù):
- `fptr`:指向要讀取數(shù)據(jù)的文件流的指針。

#### 返回值:
- 如果到達(dá)文件末尾,返回非零值(通常是 1)。
- 否則返回 0。

4.為什么需要 feof()?

getc() 在到達(dá)文件末尾時(shí)會(huì)返回 EOF,但它在讀取失敗時(shí)也會(huì)返回 EOF。因此,僅靠比較 getc() 的返回值和 EOF 并不足以判斷是否真的到了文件末尾。為了解決這個(gè)問題,C 提供了 feof() 函數(shù)。

示例 1:無法區(qū)分錯(cuò)誤還是文件結(jié)束

#include <stdio.h>

int main() {
    FILE *fptr = fopen("file.txt", "w");
    char ch;

    // 嘗試用 getc() 讀取一個(gè)字符
    ch = getc(fptr);

    // 處理 EOF 返回值
    if (ch == EOF)
        printf("文件結(jié)束或無法讀取");
    else
        printf("讀取的字符:%c", ch);

    fclose(fptr);
    return 0;
}

輸出:

文件結(jié)束或無法讀取

在上述程序中,文件是以“只寫”模式打開的,getc() 無法讀取數(shù)據(jù),但它仍然返回 EOF,這使得我們難以判斷錯(cuò)誤的來源。此時(shí)可以使用 feof() 來明確判斷是否到達(dá)文件末尾。

示例 2:使用 feof() 明確判斷文件結(jié)束

#include <stdio.h>

int main() {
    FILE *fptr = fopen("file.txt", "w");
    char ch;

    // 嘗試用 getc() 讀取一個(gè)字符
    ch = getc(fptr);

    // 處理 EOF 返回值
    if (ch == EOF) {
        // 檢查是文件結(jié)束,還是讀取失敗
        if (feof(fptr))
            printf("文件結(jié)束");
        else
            printf("無法讀取");
    } else
        printf("讀取的字符:%c", ch);

    fclose(fptr);
    return 0;
}

輸出:

無法讀取

三. C 中的 clearerr() 函數(shù)

在 C 語言中,文件操作中的錯(cuò)誤可以通過 ferror()feof() 函數(shù)來檢測。但這些錯(cuò)誤標(biāo)志一旦設(shè)置就會(huì)一直保留,直到被顯式清除。clearerr() 是一個(gè)標(biāo)準(zhǔn)庫函數(shù),用于在你進(jìn)行文件讀寫操作時(shí)手動(dòng)清除這些錯(cuò)誤標(biāo)志。

語法 : clearerr() 是定義在頭文件 <stdio.h> 中的標(biāo)準(zhǔn)庫函數(shù)。

clearerr(fptr);
#### 參數(shù):
- `fptr`:指向文件流的文件指針。

#### 返回值:
- 該函數(shù)**沒有返回值**(`void`)。

示例 1:

#include <stdio.h>

int main() {
    FILE *fptr = fopen("gfg.text", "rw+");

    // 清除錯(cuò)誤和 EOF 標(biāo)志
    clearerr(fptr);
    if (!feof(fptr))
        printf("EOF 重置成功");
    return 0;
}

輸出:

EOF 重置成功

示例 2:清除 EOF 標(biāo)志的實(shí)際用法

#include <stdio.h>

int main() {
    FILE *fptr = fopen("gfg.txt", "w+");
    fprintf(fptr, "GeeksForGeeks!");

    // 不斷讀取直到遇到 EOF
    while (fgetc(fptr) != EOF);

    if (feof(fptr)) {
        printf("遇到 EOF\n");
    }

    // 使用 clearerr() 清除 EOF 標(biāo)志
    clearerr(fptr);
    if (!feof(fptr)) {
        printf("EOF 已成功重置");
    }

    fclose(fptr);
    return 0;
}

輸出:

遇到 EOF
EOF 已成功重置

總結(jié):

  • clearerr() 用于清除文件流的錯(cuò)誤標(biāo)志和 EOF 標(biāo)志。
  • 它不會(huì)返回任何值,只是重置狀態(tài)。
  • 常用于重復(fù)讀寫文件調(diào)試文件操作時(shí)。

四. C 語言文件操作中的錯(cuò)誤處理

文件操作是 C 編程中的常見任務(wù),但可能遇到各種錯(cuò)誤,需要優(yōu)雅地處理。良好的錯(cuò)誤處理能讓程序在面對(duì)“文件缺失”“權(quán)限不足”等突發(fā)情況時(shí)不至于崩潰。本文將學(xué)習(xí)如何在 C 語言文件操作中處理這些常見錯(cuò)誤。

常見文件操作錯(cuò)誤一覽

錯(cuò)誤原因
文件未找到試圖打開一個(gè)不存在的文件
權(quán)限被拒絕對(duì)文件訪問權(quán)限不足
磁盤已滿寫入時(shí)磁盤空間耗盡
文件已存在用 “w” 模式創(chuàng)建已存在的文件
無效文件指針使用 NULL 或非法 FILE* 進(jìn)行讀寫
已到文件尾 (EOF)讀操作越過文件末尾
文件未打開在未成功打開的文件上繼續(xù)操作

若不做錯(cuò)誤檢查,程序可能出現(xiàn)異常行為:提前終止或輸出錯(cuò)誤結(jié)果。

錯(cuò)誤處理技巧(不一定非要這么處理,只是簡單建議,要靈活處理)

1. 處理 “文件未找到”

以只讀 “r” 或追加 “a” 模式打開文件時(shí),若文件不存在,fopen 返回 NULL。用 perror 打印系統(tǒng)提示。

#include <stdio.h>

int main(void) {
    FILE *file = fopen("file.txt", "r");
    if (file == NULL) {
        perror("Error");
        return 1;
    }
    fclose(file);
    return 0;
}

輸出:
Error: No such file or directory

2. 處理 “權(quán)限被拒絕”

文件存在但無權(quán)限時(shí),fopen 同樣返回 NULL,perror 會(huì)輸出 “Permission denied”。

FILE *file = fopen("/restricted/file.txt", "w");
if (file == NULL) {
    perror("Permission denied");
}

3. 處理 “磁盤已滿”

寫入后通過 ferror 檢測流錯(cuò)誤。

#include <stdio.h>

int main(void) {
    FILE *fptr = fopen("file.txt", "w");
    if (fptr == NULL) {
        perror("Error opening file");
        return 1;
    }

    fprintf(fptr, "Writing to file");

    if (ferror(fptr)) {
        perror("Error writing to file");
    }
    fclose(fptr);
    return 0;
}

輸出示例:
Error writing to file: Permission denied

4. 處理 “文件已存在”

用 “wx” 模式創(chuàng)建新文件;若文件已存在,fopen 返回 NULL 并置 errno 為 EEXIST。

#include <stdio.h>
#include <errno.h>

int main(void) {
    FILE *fptr = fopen("test.text", "wx");
    if (fptr == NULL) {
        if (errno == EEXIST)
            printf("File already exist\n");
        return 1;
    }
    fprintf(fptr, "This is a new file.");
    fclose(fptr);
    return 0;
}

輸出:
File already exist

5. 處理 “無效文件指針”

任何讀寫前都先判斷指針是否為 NULL。

FILE *file = NULL;
if (file == NULL) {
    printf("Invalid file pointer. File operations cannot proceed.\n");
}

6. 處理 “已到文件尾 (EOF)”

讀取時(shí)用 feof 區(qū)分“正常讀完”與“讀取出錯(cuò)”。

#include <stdio.h>

int main(void) {
    FILE *file = fopen("test.txt", "r");
    int ch;
    while ((ch = fgetc(file)) != EOF)
        putchar(ch);

    if (feof(file))
        printf("End of file reached.");
    else if (ferror(file))
        printf("Error reading the file.");
    fclose(file);
    return 0;
}

輸出:
End of file reached.

7. 處理 “文件未打開”

fopen 返回 NULL 即表示打開失敗,直接判斷即可。

#include <stdio.h>
int main(void) {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("File could not be opened.\n");
    } else {
        printf("File opened successfully.\n");
        fclose(file);
    }
    return 0;
}

輸出:
File could not be opened.

8. 處理 “關(guān)閉文件失敗”

fclose 返回 -1 表示關(guān)閉出錯(cuò)。

#include <stdio.h>

int main(void) {
    FILE *fptr = fopen("test.txt", "w");
    fprintf(fptr, "Writing to file");

    if (fclose(fptr) == -1)
        printf("File closing error");
    else
        printf("File closed");
    return 0;
}

輸出:
File closing error

以上就是C語言中文件操作Error處理的方法示例的詳細(xì)內(nèi)容,更多關(guān)于C語言文件操作Error處理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

张家口市| 正宁县| 柳江县| 铁力市| 涡阳县| 绍兴市| 南康市| 武穴市| 同心县| 三河市| 金溪县| 延吉市| 鱼台县| 罗田县| 启东市| 恭城| 富蕴县| 崇文区| 尉犁县| 宜兰市| 玛多县| 黔西| 民勤县| 赤壁市| 托里县| 临邑县| 集贤县| 浦县| 南陵县| 呈贡县| 虹口区| 湖南省| 图们市| 夏邑县| 文成县| 滨州市| 平远县| 舒兰市| 姜堰市| 连城县| 濮阳县|