讀取 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;
}
r+ 模式同時讀寫,或讀取後關閉再以 w 重開。ctype.h 的 isupper/islower、toupper/tolower 簡化邏輯。