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

C++ TXT 按學號查詢:邊讀邊比對避免 fseek 定位錯誤

     編輯:程式設計疑難解答

原代碼先讀所有學號存陣列,再 `fseek` 定位行首,但 `RECORDLENGTH` 固定 1000 導致定位偏移 (每行長度不一)。

正確做法:單次掃描、邊讀邊比對、找到即處理


#include 
#include 

struct Student {
    long long Sno; char Sname[20], Ssex[6], Sdept[20]; int Sage;
};

int main() {
    FILE* fp = fopen("StudentData.txt", "r");
    if (!fp) { perror("open"); return 1; }

    long long target; printf("請輸入學號: "); scanf("%lld", &target);

    char line[1024];
    Student s; bool found = false;
    while (fgets(line, sizeof(line), fp)) {
        if (sscanf(line, "%lld %19s %5s %d %19s", &s.Sno, s.Sname, s.Ssex, &s.Sage, s.Sdept) == 5) {
            if (s.Sno == target) { found = true; break; }
        }
    }
    fclose(fp);

    if (found) {
        printf("學號 姓名 性別 年齡 系所\n");
        printf("%lld %s %s %d %s\n", s.Sno, s.Sname, s.Ssex, s.Sage, s.Sdept);
    } else {
        printf("查無學號 %lld\n", target);
    }
    return 0;
}

關鍵修正點

  1. **移除固定 `RECORDLENGTH`**,改用 `fgets` 逐行讀取,自然適應變長行。
  2. **邊讀邊比對**,找到即 `break`,無需二次定位。
  3. `sscanf` 格式字串加寬度限制 (`%19s`),防緩衝區溢位。
  4. 若檔案極大 (GB 級),可建立 **學號→位移 索引檔** (離線建立),查詢時 `fseek` 精確定位。

進階:索引檔建立範例


// 離線建立
unordered_map idx; // Sno -> file offset
FILE* fp = fopen("StudentData.txt", "r");
long long pos = 0; char line[1024];
while (true) {
    long long cur = ftell(fp);
    if (!fgets(line, sizeof(line), fp)) break;
    long long sno; if (sscanf(line, "%lld", &sno)==1) idx[sno] = cur;
}
// 查詢時
auto it = idx.find(target);
if (it != idx.end()) {
    fseek(fp, it->second, SEEK_SET);
    fgets(line, sizeof(line), fp);
    // 解析輸出
}

「邊讀邊比對」解決 99% 教學級查詢需求;大檔高頻查詢才需建立索引檔。

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