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

C 語言文件隨機讀取:fseek 定位行列,fgets 讀取內容

     編輯:程式設計綜合問答

代碼邏輯逐行解析

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 字節,中文環境下不準)。

潛在問題與改進

  1. 中文/多字節字符下列偏移失效:fseek(fp, col, SEEK_CUR) 按字節偏移,UTF-8 中文字符佔 3 字節。改進:讀整行後用 strncpy 或 mbstowcs 按字符截取。
  2. 行號越界無保護:while(row--) 若 row 大於文件總行數,會讀到 EOF 導致 buf 為空/亂碼。需檢查 fgets 返回值。
  3. 緩衝區大小 MAX=81 可能不足:長行會被截斷,建議動態分配或增大。

改進版核心邏輯

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) 偏移列。**注意多字節字符環境下列偏移失效**,實際項目建議讀整行後在內存中按字符處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved