while (scanf("%d%d", &row, &col) == 2) { // 讀入行、列,成功讀2個進入循環
row--, col--; // 轉為 0 基索引
fseek(fp, 0, SEEK_SET); // 文件指針回到開頭
while (row--) fgets(buf, MAX, fp); // 循環讀行,跳過 row 行
fseek(fp, col, SEEK_CUR); // 從當前位置偏移 col 列
fgets(buf, MAX, fp); // 讀取該行剩餘內容
printf("%s", buf); // 輸出
printf("input the start position to output:");
}
fseek(fp, 0, SEEK_SET):定位到文件開頭。fgets(buf, MAX, fp):讀取一行(含換行符)或 MAX-1 字符。fseek(fp, col, SEEK_CUR):相對當前位置偏移 col 字節(此處假設每字符 1 字節,中文環境下不準)。fseek(fp, col, SEEK_CUR) 按字節偏移,UTF-8 中文字符佔 3 字節。改進:讀整行後用 strncpy 或 mbstowcs 按字符截取。while(row--) 若 row 大於文件總行數,會讀到 EOF 導致 buf 為空/亂碼。需檢查 fgets 返回值。while (scanf("%d%d", &row, &col) == 2) {
fseek(fp, 0, SEEK_SET);
for (int r = 1; r < row && fgets(buf, MAX, fp); r++); // 跳轉到目標行
if (feof(fp)) { printf("Row out of range\n"); continue; }
// 按字符處理列偏移(假設已讀入整行 buf)
char *p = buf;
int c = 0;
while (*p && c < col) { p++; c++; } // 簡易字符計數,實際需多字節感知
printf("%s", p);
}
程序實現「按行列座標讀取文件內容」:fseek 定位行,fgets 讀行,fseek(SEEK_CUR) 偏移列。**注意多字節字符環境下列偏移失效**,實際項目建議讀整行後在內存中按字符處理。