首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言檔案處理:讀取 data.txt 並將英文字母大小寫互轉後覆寫

     編輯:程式設計綜合問答

題目需求

讀取 data.txt 內容,將所有英文字母大小寫互換(大寫變小寫、小寫變大寫),非字母字元保持不變,最後將結果覆寫回同一檔案。

常見錯誤與修正

原始碼存在以下問題:

  • 同時開啟同一檔案進行讀寫,導致資料損毀。
  • 使用 feof() 或 EOF 判斷邏輯錯誤,fgetc() 回傳 int 需以 int 變數接收。
  • 大小寫轉換邏輯重複且錯誤(ch - 'A' + 'a' 只適用於大寫轉小寫)。
  • 使用 system("del")、system("ren") 非跨平台且不安全。

正確實作範例

#include <stdio.h>
#include <ctype.h>

int main(void) {
    FILE *fp = fopen("data.txt", "r+");
    if (!fp) return 1;

    long pos = 0;
    int ch;
    // 先讀取全部內容至記憶體
    fseek(fp, 0, SEEK_END);
    long len = ftell(fp);
    rewind(fp);
    char *buf = malloc(len + 1);
    fread(buf, 1, len, fp);
    buf[len] = '\0';

    // 轉換大小寫
    for (long i = 0; i < len; i++) {
        if (isupper(buf[i])) buf[i] = tolower(buf[i]);
        else if (islower(buf[i])) buf[i] = toupper(buf[i]);
    }

    // 覆寫檔案
    fseek(fp, 0, SEEK_SET);
    fwrite(buf, 1, len, fp);
    ftruncate(fileno(fp), len); // 確保截斷多餘殘留
    free(buf);
    fclose(fp);
    return 0;
}

關鍵點總結

  1. 使用 r+ 模式同時讀寫,或讀取後關閉再以 w 重開。
  2. 利用 ctype.h 的 isupper/islower、toupper/tolower 簡化邏輯。
  3. 大檔案建議分塊處理,避免記憶體不足。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved