[問題] 分批讀取大量資料的.txt檔(問題更新)

看板C_and_CPP作者 (~大肉圓~)時間14年前 (2010/05/15 02:23), 編輯推噓7(703)
留言10則, 7人參與, 最新討論串1/1
各位版友好,小弟本身是非資工背景的學生,而且才剛接觸C語言, 因為一時興起去跨修電資學院的課,現在遇到了程式上的問題, 希望版上的朋友給點建議。 遇到的問題: (題意請描述清楚) 小弟想撰寫一個讀取.txt檔的程式,檔案內容如下, EX:以下是abc.txt的資料 -------------------------------------- | aaa bbb ccc ddd |此列為數據名稱 | 6.9 dsfs 1.0 3.68 | | 6.9 sds 1.0 3.68 | | 6.9 vbs 1.0 3.68 | | 1.3 vbb 2.35 2.914 | | 6.9 2vbv 1.0 3.68 | -------------------------------------- 數字 文字+數字 數字 數字 此資料約80多萬筆(列),且其中包含純數字或是文字+數字的欄位。 希望得到的正確結果: 抽取符合aaa行數值為6.9的所有列, 並將其顯示成如原本的檔案格式, EX:以下是abc.txt的資料 -------------------------------------- | aaa bbb ccc ddd |此列為數據名稱 | 6.9 dsfs 1.0 3.68 | | 6.9 sds 1.0 3.68 | | 6.9 vbs 1.0 3.68 | | 6.9 2vbv 1.0 3.68 | | 6.9 sdsS 1.0 3.68 | | 6.9 vSDD 1.0 3.68 | | 6.9 2DSv 1.0 3.68 | | . | | . | | . | | . | -------------------------------------- 程式跑出來的錯誤結果: 小弟有嘗試用Dev-C++撰寫開檔程式,但是參考版上的CODE, 再編譯時using namespace std就出現問題, #include <iostream> #include <fstream> using namespace std; 不知道是小弟哪裡設定錯誤。 之前有用過fopen就可以開啟,但是因為筆數太多吃近來也沒意義, 不知道能否像小弟提出的想法讀取。 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) Dev-C++ 有問題的code: (請善用置底文標色功能) 以下是經由Dannvix大大所提供的code所修改的, 目前已經可以經由判讀第一欄位是否為所需數值來取值, 但小弟這邊又有個疑問,如果是想判斷第二欄位或是第三欄位的數值, 那應該如何改寫strncmp,小弟試了幾次都不行,甚致如果要更進一步, 比如說取該列的第一欄跟第三欄的數值來比較(大小or是否相等之類)後, 再決定是否取值,請問有版友有想法的嗎? #include <stdio.h> #include <string.h> #define MAX_LEN (200) #define TARGET "1.0" #define TARGET1 "2.35" int main (void) { FILE *fd_in = fopen("input.txt", "r"); FILE *fd_out = fopen("output.txt", "w"); char buf[MAX_LEN], *ptr; /* 處理第一行 (欄位名稱) */ fgets(buf, MAX_LEN, fd_in); fputs(buf, fd_out); /* 使用 while + feof() 來處理未知筆數的資料 */ while (!feof(fd_in)) { /* 讀一整行進來 */ fgets(buf, MAX_LEN, fd_in); /* 檢查第一個數字是否為我們想要的 */ /* 如果是的話,就照原樣輸出 */ if (strncmp(buf, TARGET, strlen(TARGET)) == 0) fputs(buf, fd_out); if (strncmp(buf, TARGET1, strlen(TARGET1)) == 0) fputs(buf, fd_out); } fclose(fd_in); fclose(fd_out); return 0; } 補充說明: 因為小弟真的已經沒辦法,所以才會這樣沒頭沒腦的問問題, 希望各位版友見諒,在此先感謝版友耐心的看完,如果有想法 麻煩請您與我分享,小弟感激不盡。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.118.38.150

05/15 02:27, , 1F
錯誤訊息先貼上來吧 還有你是寫C還是C++
05/15 02:27, 1F
小弟是寫C,完整的程式碼因為沒有頭緒,所以還沒寫出來

05/15 02:28, , 2F
#include後面不用加分號
05/15 02:28, 2F
謝謝,小弟下次會注意 ※ 編輯: Bigbawan 來自: 140.118.38.150 (05/15 02:48)

05/15 03:23, , 3F
把資料讀出來,放到一個二維陣列,判斷開頭為6.9的寫入檔案裡
05/15 03:23, 3F

05/15 03:27, , 4F
一行一行讀 不要一次整篇讀入
05/15 03:27, 4F
想請教一下大大,如果一行一行讀要用什麼語法? ※ 編輯: Bigbawan 來自: 140.118.38.150 (05/15 03:53) ※ 編輯: Bigbawan 來自: 140.118.38.150 (05/15 04:43) ※ 編輯: Bigbawan 來自: 140.118.38.150 (05/15 04:46)

05/15 09:11, , 5F
std::getline()
05/15 09:11, 5F

05/15 09:16, , 6F
fgets()
05/15 09:16, 6F

05/15 09:28, , 7F
fscanf() ? 不過可能要用C的函式讀檔
05/15 09:28, 7F
※ 編輯: Bigbawan 來自: 140.118.38.150 (05/16 00:17)

05/16 02:18, , 8F
資料都在buf裡, 你可以進行任何字串操作
05/16 02:18, 8F

05/16 02:34, , 9F
const char *str = buf; 然後str 往後指到第 x 欄資料
05/16 02:34, 9F

05/16 02:35, , 10F
的位址, 再拿去 strncmp 比較即可
05/16 02:35, 10F
文章代碼(AID): #1BxPKZPV (C_and_CPP)