全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:10086
推到 Plurk!
推到 Facebook!

請問如何從txt檔一個一個資料讀進來?

尚未結案
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-28 16:56:50 IP:219.80.xxx.xxx 未訂閱
我的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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-28 17:53:50 IP:221.169.xxx.xxx 未訂閱
直接讀進來就行了 ex:    
#include 
#include 
using namespace std;    int main(int argc, char* argv[])
{
        ifstream f;
        double x;
        f.open("i.txt");
        while (!f.eof())
        {
                f >> x;
                cout << x << " " ;
        }
        cout << endl;
        return 0;
}
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-28 22:02:59 IP:61.142.xxx.xxx 未訂閱
一次讀進來處理例以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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-28 22:39:43 IP:221.169.xxx.xxx 未訂閱
如果是一次要先讀入一行的話,是有比較麻煩的辦法 用c的話,就一個一個讀進來放到char*去,直到'\n'為止 然後用scanf去處理    用c++的話
#include 
#include 
#include     using namespace std;    int main(int argc, char* argv[])
{
        ifstream f;
        double x;
        f.open("i.txt");
        char s[255];
        while (!f.eof())
        {
                f.getline(s, 254);
                stringstream w(s);
                while (!w.eof())
                {
                        w >> x;
                        cout << x << " " ;
                }
                cout << endl << endl;
        }
        cout << endl;
        f.close();
        return 0;
}
但要注意的是,若txt最後一行只有一個'\n',他依然會進行處理 而且會把上一行的最後一個元素在印出來一次 因此,應該在readline之後,要檢查一下讀出的字元數才是
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-29 02:01:01 IP:219.80.xxx.xxx 未訂閱
感謝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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-29 20:01:50 IP:221.169.xxx.xxx 未訂閱
那不然就把「開檔」和「讀一行資料、處理一行資料」的地方分開處理    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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-30 08:48:24 IP:202.104.xxx.xxx 未訂閱
引言: 感謝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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-30 12:57:43 IP:219.80.xxx.xxx 未訂閱
再次感謝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;iCount;i  )
     {
      Data[0][i]=Str->Strings[i].ToDouble();
     }
基本上的做法是這樣,如果還有其它更好的做法或是建議,還請不吝賜教. 謝謝. 發表人 - nlj859 於 2004/08/30 12:59:25
willis
一般會員


發表:9
回覆:11
積分:4
註冊:2002-09-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-03 15:29:42 IP:61.218.xxx.xxx 未訂閱
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
系統時間:2024-07-01 19:54:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!