看板 C_and_CPP 關於我們 聯絡資訊
以下是 Code 附上註解,由於浮點數比較會有誤差,所以直接比較字串 另外,我假定你的輸入資料中是沒有那個框框、每行的開頭也沒有空白 // 若格式不同則修改對應的 TARGET 即可 #include <stdio.h> #include <string.h> #define MAX_LEN (200) #define TARGET "6.9" int main (void) { FILE *fd_in = fopen("input", "r"); FILE *fd_out = fopen("output", "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); } fclose(fd_in); fclose(fd_out); return 0; } ※ 引述《Bigbawan (~大肉圓~)》之銘言: : 各位版友好,小弟本身是非資工背景的學生,而且才剛接觸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: (請善用置底文標色功能) : 這是小弟爬文後試出來比較接近我要的程式 : #include<stdio.h> : #include<stdlib.h> : int main() : { : int line[6]; : FILE *inp = fopen ("input.txt", "r"); : FILE *outp = fopen ("output.txt", "w"); : if(inp != NULL) : { : for(int i=0;i<6;i++) : { : fscanf(inp,"%d", &line[i]); : } : fprintf(outp,"%d", line[2]); : } : fclose (inp); : fclose (outp); : return 0; : } : 雖然可以將指定的列取出,但小弟還是不知道如何加判斷式讓程式自行取出想要的列。 : 還有因為筆數過多,小弟也無法精準的知道是幾列,那要如何令i值,有辦法讓程式自行 : 判斷上限嗎? : 補充說明: : 因為小弟真的已經沒辦法,所以才會這樣沒頭沒腦的問問題, : 希望各位版友見諒,在此先感謝版友耐心的看完,如果有想法 : 麻煩請您與我分享,小弟感激不盡。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.227.84.109 ※ 編輯: Dannvix 來自: 125.227.84.109 (05/15 13:28)
Bigbawan:感謝大大熱心教學,小弟趕快來測設一下^^ 05/15 22:29
Bigbawan:小弟已經成功抓取資料,也成功嘗試多筆TARGET來取值 05/15 23:44
Bigbawan:D大小弟友新的問題,已在原文提出,如您有空,煩請撥空看 05/16 00:19
Bigbawan:看,看是否能給小弟一點建議,感謝您 05/16 00:19
Bigbawan:在(有問題的code:)之後有提出問題點 05/16 00:20
Dannvix:原文下面有人推文提出正解了 就是用指標往後指 05/16 13:01
Bigbawan:感謝D大回覆 ^^ 05/16 16:45