請問如何從txt檔一個一個資料讀進來? |
尚未結案
|
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
我的txt資料如下:
7.0700000e+000[空][空]6.6900000e+000[空][空]6.7900000e+000[空][空]...
1.0700000e+000[空][空]2.6900000e+000[空][空]3.7900000e+000[空][空]...
...
...
...
請問我該如何一個資料一個資料讀進來,一行結束之後再自己換行,不要一行一行讀進來之後再拆解每個資料?
(一次只讀一行,之後將每個資料存到array裡)
該用哪種方法比較適合?
謝謝. 發表人 - nlj859 於 2004/08/28 22:44:34
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
一次讀進來處理例以Memo處理: Memo1->Clear(); Memo2->Clear(); TStrings* Str = new TStringList(); Memo1->Lines->LoadFromFile("D:\\0000.txt"); // 載入檔案 Str->CommaText=Memo1->Text; // 空白及逗點和斷行字串會自動分離 for (int i=0;i < Str->Count ; i ) { Memo2->Lines->Add(Str->Strings[i]); } 或直接以TStrings處理 Memo1->Clear(); TStrings* Str = new TStringList(); Str->LoadFromFile("D:\\0000.txt"); Str->CommaText=Str->Text; for(int i = 0; i < Str->Count; i ) { Memo1->Lines->Add(Str->Strings[i]); } 請參考Andy Chang
------
Andy Chang |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
如果是一次要先讀入一行的話,是有比較麻煩的辦法
用c的話,就一個一個讀進來放到char*去,直到'\n'為止
然後用scanf去處理 用c++的話
#include但要注意的是,若txt最後一行只有一個'\n',他依然會進行處理 而且會把上一行的最後一個元素在印出來一次 因此,應該在readline之後,要檢查一下讀出的字元數才是 |
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
感謝justdo和AndyChang的回覆, AndyChang,
我每次只能讀一行喔,不是整個都把它讀完再一次處理.
ex:開始讀第一行(假設每行有10筆資料),讀出之後把他存在一個aray[10]裡.10秒過後再讀第2行...10秒過後,再讀第3行,依此類推. justdo,
使用過你所提供的code之後,好像會一直讀檔,且不會有停止的動作.
因為我現在是開發視窗的程式,所以純C 的code不太清楚要怎麼去達到我的要求. 還懇請給點意見.
謝謝. 發表人 - nlj859 於 2004/08/29 18:28:11
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
那不然就把「開檔」和「讀一行資料、處理一行資料」的地方分開處理 Form OnCreate 的時候
ifstream f; f.open("i.txt");按下某個按鍵的時候 double x[20]; //最多一次讀20個 int i=0; char s[255]; //一行只讀取254個字元 if (!f.eof()) { f.getline(s, 254); stringstream w(s); while (!w.eof()) { w >> x[i ]; } }然後看你要怎麼處理x變數了 |
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言: 感謝justdo和AndyChang的回覆, AndyChang, 我每次只能讀一行喔,不是整個都把它讀完再一次處理. ex:開始讀第一行(假設每行有10筆資料),讀出之後把他存在一個aray[10]裡.10秒過後再讀第2行...10秒過後,再讀第3行,依此類推. justdo, 使用過你所提供的code之後,好像會一直讀檔,且不會有停止的動作. 因為我現在是開發視窗的程式,所以純C 的code不太清楚要怎麼去達到我的要求. 還懇請給點意見. 謝謝. 發表人 - nlj859 於 2004/08/29 18:28:11 開始讀第一行(假設每行有10筆資料),讀出之後把他存在一個aray[10]裡.10秒過後再讀第2行...10秒過後,再讀第3行,依此類推. 這有意思!不知道是使用於那裡? 讀檔的方式很多種, StrRead = new TStringList(); StrRead->LoadFromFile("D:\\0000.txt"); Memo1->Lines->LoadFromFile("D:\\0000.txt"); Memo1->Lines->[i]; StrRead->Strings[i]; 都是可以讀出一行,要十秒讀出一次! 我會建立 private: // User declarations int time_loop_count; int txt_count; TStrings* StrRead; TForm1 *Form1; static int txt_read=0; // 讀到第幾行 void __fastcall TForm1::FormShow(TObject *Sender) { StrRead = new TStringList(); time_loop_count=10; //每十秒處理一次 Memo1->Clear(); Memo2->Clear(); // 使用Memo1或StrRead讀入都可以 Memo1->Lines->LoadFromFile("D:\\0000.txt"); StrRead->LoadFromFile("D:\\0000.txt"); txt_count=StrRead->Count; // 總行數 } void __fastcall TForm1::Timer1Timer(TObject *Sender) { static time_read=0; // 每秒執行一次 Timer1->Enabled=false; // 現在是否滿足time_loop_count 且小於檔案總行數 if ( time_read >= time_loop_count && txt_read < txt_count) { TStrings* Str = new TStringList(); Str->CommaText=StrRead->Strings[txt_read]; // 把字串分解以逗號或空白 // 處理字串 for (int i=0; i < Str->Count ; i ) { // Str->Strings[i] Memo2->Lines->Add(Str->Strings[i]); } txt_read ; time_read=0; delete Str; } else time_read ; Timer1->Enabled=true; } void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { delete StrRead; } 請參考!Andy Chang
------
Andy Chang |
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
再次感謝justdo和AndyChang的回覆, 我的做法是:
Timer ->10秒一次,並記錄已取到第幾行了,我想這種做法和AndyChang的做法一樣.只是我把每行再另外存檔再去處理,因為每10秒所讀的資料要做一些記錄,及另外傳至其它台電腦做處理.
TStringList *txt=new TStringList; TStringList *txtTemp=new TStringList; txt->LoadFromFile("c:\\test\\Prod.txt"); tt=t 1; for (int m=t;mAdd(txt->Strings[m]); txtTemp->SaveToFile("c:\\test\\ProdTemp.txt"); } delete txt; delete txtTemp; //各別存入array TStrings* Str = new TStringList(); Str->LoadFromFile("c:\\test\\ProdTemp.txt"); Str->CommaText=Str->Text; for(int i=0;i基本上的做法是這樣,如果還有其它更好的做法或是建議,還請不吝賜教. 謝謝. 發表人 - nlj859 於 2004/08/30 12:59:25 |
willis
一般會員 發表:9 回覆:11 積分:4 註冊:2002-09-12 發送簡訊給我 |
void __fastcall TForm1::Button1Click(TObject *Sender) { char str[255]; if(fscanf(fp,"%s",str)!=EOF) ListBox1->Items->Add(StrPas(str)); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { fp=fopen("1.txt","r"); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { fclose(fp); } //---------------------------------------------------------------------------如果要每十秒讀資料就把 char str[255]; if(fscanf(fp,"%s",str)!=EOF) ListBox1->Items->Add(StrPas(str)); 加到TIMER |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |