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

請問有關於從多個文字檔中抽取部分字母到一個文字檔的問題

尚未結案
Saladin
一般會員


發表:18
回覆:9
積分:5
註冊:2005-01-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-20 17:04:51 IP:61.223.xxx.xxx 未訂閱
void __fastcall TFormPre::N_selectClick(TObject *Sender) { //程式目的:將多個檔案的序列與結構提出來存成一個檔 ctime=1; Memo1->Clear(); Memo2->Clear(); MemoText->Clear(); int size=10000; int len; int pos=0; int pos2=0; char c; char*temp=new char[size]; int memoLength; char*outstring; FILE *train; FILE *train2; FILE *stream; // char FirstLine[512]; char* aastring; OpenDialog1->Options.Clear(); OpenDialog1->Options << ofAllowMultiSelect << ofFileMustExist; OpenDialog1->Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"; OpenDialog1->FilterIndex = 2; // start the dialog showing all files if (OpenDialog1->Execute()) { for (int I = 0; I < OpenDialog1->Files->Count; I ) { //FILE *stream; stream = fopen(OpenDialog1->Files->Strings[I].c_str(), "r"); if (stream) { pos=0; pos2=0;// // read the first line from the file //多重選擇 //=============================================================// fclose(stream); Memo1->Clear(); Memo1->Lines->LoadFromFile(OpenDialog1->Files->Strings[I].c_str()); len=Memo1->GetTextLen(); aastring=Memo1->Lines->Text.c_str(); aastring[len]='\0'; c=aastring[pos]; while(c!=':') { pos ; c=aastring[pos]; } pos ; c=aastring[pos]; while(c!='\r'&&c!='\n') { temp[pos2 ]=c; c=aastring[ pos]; } temp[pos2 ]='\r'; temp[pos2 ]='\n'; while(c=='\r'||c=='\n') { c=aastring[ pos]; } while(aastring[pos]!='d'||aastring[pos 1]!='s'||aastring[pos 2]!='s'||aastring[pos 3]!='p'||aastring[pos 4]!=':') { pos ; } pos =5; c=aastring[pos]; while(c!='\r'&&c!='\n') { temp[pos2 ]=c; c=aastring[ pos]; } delete aastring; temp[pos2 ]='\r'; temp[pos2 ]='\n'; temp[pos2]='\0'; Memo2->Clear(); Memo2->SetTextBuf(temp); delete temp; memoLength=Memo2->GetTextLen(); outstring=new char[memoLength]; Memo2->GetTextBuf (outstring,memoLength); //outstring[memoLength]='\0'; if(ctime==1)//尚未建檔 { //FILE *train; train=fopen("training_data.txt","wb"); fputs(outstring,train); fclose(train); ctime ; //delete outstring; } else//已建檔 { //FILE *train2; train2=fopen("training_data.txt","a "); fputs(outstring,train2); fclose(train2); //delete outstring; } MemoText->Lines->LoadFromFile("training_data.txt"); } } } } 這個程式的目的只是將多個檔案中第一列的:的右邊所有字母 及列中有dssp:後面的所有字母都寫在train_data.txt檔 其中ctime為全域變數,用來判斷是否已經建了這個train_data.txt檔 但是總會遇到錯誤訊息"Access violation at 0042052"(後面的數字為比方),在下程式功力弱, 希望各位前輩能指點一二 也希望前輩能指導要如何在一個函式結束後 刪除宣告在裡面的string變數(如string astring;要如何刪除astring) 謝謝 如有不禮貌之處請海涵
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-20 18:04:02 IP:210.68.xxx.xxx 未訂閱
您好:    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 >
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-21 00:00:05 IP:221.169.xxx.xxx 未訂閱
aastring=Memo1->Lines->Text.c_str();
aastring[len]='\0';
AnsiString 用 c_str()取回的指標最好不要去修改其內容 上面第二行程式是相當危險的寫法,也沒有必要 再者,你的讀取方式並沒有考慮":"是不是在開頭 也沒有檢查是不是把整個字串讀完了 既然要檢查開頭,你應該取出Memo1的每一行,來檢查 這樣也可以避免不知道結尾在哪裡,而一直讀下去
for (int i=0; iLines->Count;   i)
{
  AnsiString p=Memo1->Lines->Strings[i];
  if (!p.Empty())
  {
    if (p[0] == ':')
  ...
Saladin
一般會員


發表:18
回覆:9
積分:5
註冊:2005-01-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-22 11:10:44 IP:59.113.xxx.xxx 未訂閱
 
void __fastcall TFormPre::N_selectClick(TObject *Sender)
{
  //程式目的:將多個檔案的序列與結構提出來存成一個檔
  ctime=1;
  Memo1->Clear();
  Memo2->Clear();
  MemoText->Clear();
  int size=10000;
  int len;
  int pos=0;
  int pos2=0;
  char c;
  char*temp=new char[size];
  int memoLength;
  char*outstring;
  FILE *train;
  FILE *train2;
  FILE *stream;
  int i;
  int j;
  //
  char FirstLine[512];
  //char* aastring;
  OpenDialog1->Options.Clear();
  OpenDialog1->Options << ofAllowMultiSelect << ofFileMustExist;
  OpenDialog1->Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
  OpenDialog1->FilterIndex = 2; // start the dialog showing all files      int a=0;
  if (OpenDialog1->Execute())
  {
    for (int I = 0; I < OpenDialog1->Files->Count; I ++)
    {
      //FILE *stream;
      stream = fopen(OpenDialog1->Files->Strings[I].c_str(), "r");          if (stream)
      {
        pos=0;
        pos2=0;//
        // read the first line from the file
        //多重選擇
        //=============================================================//
        fclose(stream);
        Memo1->Clear();
        Memo1->Lines->LoadFromFile(OpenDialog1->Files->Strings[I].c_str());
        for (i=0; iLines->Count; ++i)
        {
          AnsiString p=Memo1->Lines->Strings[i];
          if (!p.IsEmpty())
          {
            if(i==0)
            {
              j=0;
              while(p[j++]!=':'){}
              j++;
              while(p[j]!='\r'&&p[j]!='\n')
              {
                fputc(p[j++],train);
              }
            }
            else
            {
              if (p[0]=='d'&&p[1]=='s'&&p[2]=='s'&&p[3]=='p'&&p[4]==':')
              {
                j=0;
                while(p[j]!='\r'&&p[j]!='\n')
                {
                  fputc(p[j++],train);
                }
              }
            }
          }
        }          }
    }
  }
  fclose(train);
  fclose(train2);
  Memo1->Lines->LoadFromFile("training_data.txt");    }    
我把程式略為修改後 結果會出現錯誤訊息如下 除錯時除錯到此行:
 
while(p[j++]!=':'){}
就會出現上面的錯誤 總覺得自己好像有很多概念沒搞懂~ 如果跟別人說自己是資工系的大概會沒人信吧~ 不過我會盡我所能學習的 請各位前輩賜教 謝謝
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-22 12:30:35 IP:61.228.xxx.xxx 未訂閱
依照你的程式看來,你必須注意Memo1->Lines->Strings[0]這個回傳的字串裡必須要有':'這個字元,否則當你跑while(p[j ]!=':'){}這段CODE的時候,會造成j值累加到未知數(也就是超出原有的字串長度)並且可能造成讀取到錯誤的記憶體空間.
Saladin
一般會員


發表:18
回覆:9
積分:5
註冊:2005-01-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-22 15:43:19 IP:61.223.xxx.xxx 未訂閱
好像不是這個問題 我讀取的個別檔案是下面的樣式  
 
seq_1acx:APAFSVSPASGASDGQSVSVSVAAAGETYYIAQCAPVGGQDACNPATATSFTTDASGAASFSFTVRKSYAGQTPSGTPVGSVDCATDACNLGAGNSGLNLGHVALTFG
seq_MACM_STRMA:APGVTVTPATGLSNGQTVTVSATTPGTVYHVGQCAVVEGVIGCDATTSTDVTADAAGKITAQLKVHSSFQAVVANGTPWGTVNCKVVSCSAGLGSDSGEGAAQAITFA
seq_KEDA_ACTSL:SAAVSVSPATGLADGATVTVSASATSTSATALQCAILAGRGACNVAEFHDFSLSG.GEGTTSVVVRRSFTGYVPDGPEVGAVDCDTAPCEIVVGGNTGEYGNAAISFG
seq_NCZS_STRCZ:APTATVTPSSGLSDGTVVKVAGAQAGTAYDVGQCAWVDGVLACNPADFSSVTADANGSASTSLTVRRSFEGFLFDGTRWGTVDCTTAACQVGLSDAAGNGPGVAISFN
OrigSeq:APAFSVSPASGASDGQSVSVSVAAAGETYYIAQCAPVGGQDACNPATATSFTTDASGAASFSFTVRKSYAGQTPSGTPVGSVDCATDACNLGAGNSGLNLGHVALTFG
cons:---EEEE---------EEEEEEE----EEEEEEEEEEE-----------EEEE-----EEEEEEEEEEEEEEE------EEE------EEEEE---------EEEEE-
dsc:---EEEEEE-------EEEEEEE----EEEEEEEEEEEE---------EEEEEE-----EEEEEEEEEEEEEE------EEEEEEEEEEEEEE--------EEEEE--
mul:----------------EEEEEE-----EEEEEEEEEEE-----------------------EEEE----------------E------E-------------------
nnssp:--EEEEE---------EEEEEE-----EEEEEEE---------------EEEE-----EEEEEEEE------------------------------------EEEEE-
phd:---EEEE---------EEEEEEE---EEEEEEEEEEEE-E---------EEEE-----EEEEEEEEEEEEEEE-----EEEE------EEEEE---------EEEEE-
pred:----------------EEEEEE-----EEEEE---------------------------EEEEEEEE-----------------------------------------
zpred:-EEEEEEE------EEEEEEEE-----EEEEEEEEEEE----EEE--EEEEE--------EEEEEEE------------EEEEEEEEEEEEEE---------EEEEEE
access:EEEBEBBEBEE-EEE-BBBBBBBBEEEBBBBBEBBBBEBBBBBEBBEBBEBBBEBEEEBBBEBEB-EBBEBBB-EEEE-BBBEBBBBBBEBBBBEEBEEBBBBBBBBE
PHD:994466324555787289999844862557767888722021135232134331353123899998743666259981223512333224111267776651677759
Pred:008888899999999089996667695558555667889989999877766770999605856995566667899998777687889977777999998888677000
dssp:--EEEEE---------EEEEEEE----EEEEEEE-EE--EE--------EEE-------EEEEE---EEEEE-----EEEEEE------EEEEE--------------
define:EEEEE----------EEEEEEE---------EEEEE---EEEEE------EEEEEE--EEEEEEE---EEEEE---EEEEEEE------EEEE------EEEEEEEEE
stride:--EEEEE---------EEEEEEE---EEEEEEEEEEE--EEEE-----EEEEE------EEEEE---EEEEE-----EEEEEE------EEEEE-------EE-----
而我在跑那一行有問題的程式碼時 只執行一次就出現問題
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-22 16:21:25 IP:61.228.xxx.xxx 未訂閱
把j的起始值設定到1,因為AnsiString的[]是從1開始讀字元的.所以0的話會產生錯誤.
Saladin
一般會員


發表:18
回覆:9
積分:5
註冊:2005-01-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-23 23:25:55 IP:61.223.xxx.xxx 未訂閱
 
  //程式目的:將多個檔案的序列與結構提出來存成一個檔
  ctime=1;
  Memo1->Clear();
  Memo2->Clear();
  MemoText->Clear();
  int size=10000;
  int len;
  int pos=0;
  int pos2=0;
  char c;
  char*temp=new char[size];
  int memoLength;
  char*outstring;
  FILE *train=fopen("traintemp.txt","w");
  FILE *stream;
  int i;
  int j;
  //
  char FirstLine[512];
  //char* aastring;
  OpenDialog1->Options.Clear();
  OpenDialog1->Options << ofAllowMultiSelect << ofFileMustExist;
  OpenDialog1->Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
  OpenDialog1->FilterIndex = 2; // start the dialog showing all files
  int a=0;
  if (OpenDialog1->Execute())
  {
    for (int I = 0; I < OpenDialog1->Files->Count; I ++)
    {
      //FILE *stream;
      stream = fopen(OpenDialog1->Files->Strings[I].c_str(), "r");          if (stream)
      {
        pos=0;
        pos2=0;//
        // read the first line from the file
        //多重選擇
        //=============================================================//
        fclose(stream);
        Memo1->Clear();
        Memo1->Lines->LoadFromFile(OpenDialog1->Files->Strings[I].c_str());
        for (i=0; i<=Memo1->Lines->Count;i++)
        {
          AnsiString p=Memo1->Lines->Strings[i];
          if (!p.IsEmpty())
          {
            if(i==0)
            {
              j=1;
              while(p[j++]!=':'){}
              j++;
              while(j<=p.Length())
              {
                fputc(p[j++],train);
              }
            }//if(i==0)
            else
            {
              if (p[1]=='d'&&p[2]=='s'&&p[3]=='s'&&p[4]=='p'&&p[5]==':')
              {
                j=6;
                while(j<=p.Length())
                {
                  fputc(p[j++],train);
                }
              }
            }//else
          }//if (!p.IsEmpty())
        }
      }
    }
  }
  fclose(train);      Memo1->Lines->LoadFromFile("traintemp.txt");    
程式改成以上的樣式 但發生以下的問題 即使除錯我也不知道問題出在哪裡 請教前輩該怎麼辦
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-24 14:07:53 IP:59.115.xxx.xxx 未訂閱
Saladin 您好:    看起來您的 traintemp.txt 檔案與透過 OpenDialog 所選擇的檔案是分別存放於不同的目錄,因此才會產生錯誤,您可以在處理 traintemp.txt 檔案時的動作時,在檔名前方都加上路徑,例如:C:\\mydir\\traintemp.txt 就應該不會有 "Cannot open file..." 的錯誤了,或者在處理其它與檔案有關的動作前前記錄下當前目錄位置,然後再處理完其它動作後,再切換回該目錄亦可,例如:
.... 前略 ....
    AnsiString oldDir = GetCurrentDir();
    if (OpenDialog1->Execute()) {
        .... 略 ....
    }
    fclose(train);        SetCurrentDir(oldDir);
    Memo1->Lines->LoadFromFile("traintemp.txt");
7 天天敲鍵盤 v 時時按滑鼠 8
Saladin
一般會員


發表:18
回覆:9
積分:5
註冊:2005-01-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-24 15:15:54 IP:59.113.xxx.xxx 未訂閱
謝謝taishyang的提醒, 以及Justdo,GerogeKu,RedSnow的幫忙, 希望我以後也有能力幫忙後進
系統時間:2024-06-20 3:39:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!