記憶體錯誤 |
答題得分者是:aftcast
|
b09101015
一般會員 發表:4 回覆:11 積分:3 註冊:2011-01-21 發送簡訊給我 |
以下為我的程式
我現在是利用SPcomm接收RS232資料 然後做一些數據的處理 以下是我將資料放置MEMO內當達一定的數目 就會把最舊的刪掉 補上新的並存入檔案中 可是 當我接受了二三十次後 就會停在下面這行 fprintf( output, "%s\n",Memo1->Lines->Strings[0].c_str()); 並顯示如圖中的訊息 請問有沒有人可以幫忙一下 謝謝 [code cpp] if(LineOver) { sprintf(filename, "measure_data\\%s_measure.txt", Edit_ID->Text); output=fopen(filename,"wt "); // 第1個參數是檔名, 第2個參數是開啟檔案的模式, w代write, t代text fprintf( output, "%s\n",Memo1->Lines->Strings[0].c_str()); while(0 == fclose(output)); output=fopen(filename,"at "); // 第1個參數是檔名, 第2個參數是開啟檔案的模式, w代write, t代text for(i=1;i { char *tt = Memo1->Lines->Strings[i].c_str(); fprintf( output, "%s\n",tt); } while(0 == fclose(output)); Memo1->Lines->LoadFromFile(filename); LineOver = 0; } |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
[code cpp] sprintf(filename, "measure_data\\%s_measure.txt", Edit_ID->Text.c_str()); //output=fopen(filename,"wt "); // 第1個參數是檔名, 第2個參數是開啟檔案的模式, w代write, t代text //fprintf( output, "%s\n",Memo1->Lines->Strings[0].c_str()); //while(0 != fclose(output)); output=fopen(filename,"at "); // 第1個參數是檔名, 第2個參數是開啟檔案的模式, w代write, t代text for(i=0;i { fprintf( output, "%s\n",Memo1->Lines->Strings[i].c_str()); } while(0 != fclose(output)); Memo1->Lines->LoadFromFile(AnsiString(filename)); LineOver = 0; [/code]
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
b09101015
一般會員 發表:4 回覆:11 積分:3 註冊:2011-01-21 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
[code cpp] sprintf(filename, "measure_data\\%s_measure.txt", Edit_ID->Text.c_str()); //要加 c_str DeleteFile(ExtractFileDir(Application->ExeName) AnsiString("\\") AnsiString(filename)); // 刪除檔案 output=fopen(filename,"wt"); //開檔準備寫 for(i=0;i { fprintf( output, "%s\n",Memo1->Lines->Strings[i].c_str()); } while(0 != fclose(output)); // 這是是不等於,你原來的寫法是錯的 Memo1->Lines->LoadFromFile(AnsiString(filename)); // 要自己轉型別才最穩最安全 LineOver = 0; [/code] 一案歸一案,之前po的問題,請適當的結案。我已沒分數的考量(五星了),只是一種原則。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
b09101015
一般會員 發表:4 回覆:11 積分:3 註冊:2011-01-21 發送簡訊給我 |
蕭沖大哥不好意思 我不是不願意結案....
只是我現在沒辦法進去我所提的那個畫面 進去後都會變成無法顯示網頁 請問我該向誰反映 不好意思讓你以為我沒有意願結案.... 請問一下 那我下面這樣寫有錯嗎? 也是停在fprintf那邊 AnsiString temp; //sprintf(dd, "%s.txt", Edit_ID->Text.c_str()); temp = AnsiString(Label_date->Caption.c_str()); temp = "_"; temp = AnsiString(buf); char *tt = temp.c_str(); FILE *output; sprintf(filename, "measure_data\\%s_measure.txt", Edit_ID->Text.c_str()); output=fopen(filename,"ab"); // 第1個參數是檔名, 第2個參數是開啟檔案的模式, w代write, t代text //fprintf( output, "%s_%s\n",Label_date->Caption.c_str(),buf); fprintf( output, "%s\n",tt); while(0 != fclose(output)); |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
[code cpp] AnsiString temp; //sprintf(dd, "%s.txt", Edit_ID->Text.c_str()); temp = Label_date->Caption AnsiString("_") AnsiString(buf); // Label_date->Caption 本身就是ansistring,不要再轉 //char *tt = temp.c_str(); 最好不要這樣的寫法,到需要用的時候在 c_str() FILE *output; sprintf(filename, "measure_data\\%s_measure.txt", Edit_ID->Text.c_str()); output=fopen(filename,"ab"); // 第1個參數是檔名, 第2個參數是開啟檔案的模式, w代write, t代text //fprintf( output, "%s_%s\n",Label_date->Caption.c_str(),buf); fprintf( output, "%s\n",temp.c_str()); while(0 != fclose(output)); [/code] 你的問題常常是 char * 的型別與 AnsiString的型別沒搞清楚… 還有,如果還有問題的話… 1/ 把完整一點的程式碼貼出來 (因為每次貼的都不一樣,也不知是否有解決上一次的) 2/ 自己要再多修練內力,把c / c 的書拿來看一下。 3/ 學會下中斷點,然後觀察中斷時的許多變數的情形(把游標移到變數一停一下就會看到),這樣只己比較會知道錯在哪 我了解你可能很認真,但這樣下去就不知道要怎一直的幫你下去,我只能幫你片斷的。你還是要多靠自己的力量,尤其是去理解我所改的地方,為何而改,並記下來。這樣才不會一直又反複的錯同樣的東西。 祝你好運了!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
b09101015
一般會員 發表:4 回覆:11 積分:3 註冊:2011-01-21 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我決定幫你改一下你的原來的寫法,不再照你的寫法…建議請依我的寫法來試。
盡量不要用相對路徑來處理檔案,尤其是在debug時。 [code cpp] AnsiString asFileName = ExtractFileDir(Application->ExeName) AnsiString("\\measure_data\\") Edit_ID->Text AnsiString("_measure.txt"); ShowMessage(asFileName); output=fopen(asFileName.c_str(),"ab"); [/code]
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
b09101015
一般會員 發表:4 回覆:11 積分:3 註冊:2011-01-21 發送簡訊給我 |
蕭大
我已經照你的方法使用 還是會停在那邊 而且接收二三十次後output 依舊等於NULL 我也有使用wile迴圈 去一直開啟 但永遠打不開 會死在回圈內 AnsiString temp; //sprintf(dd, "%s.txt", Edit_ID->Text.c_str()); temp = Label_date->Caption AnsiString("_") AnsiString(buf); // Label_date->Caption 本身就是ansistring,不要再轉 //char *tt = temp.c_str(); 最好不要這樣的寫法,到需要用的時候在 c_str() FILE *output; AnsiString asFileName = ExtractFileDir(Application->ExeName) AnsiString("\\measure_data\\") Edit_ID->Text AnsiString("_measure.txt"); ShowMessage(asFileName); output=fopen(asFileName.c_str(),"at"); //fprintf( output, "%s_%s\n",Label_date->Caption.c_str(),buf); fprintf( output, "%s\n",temp.c_str()); while(0 != fclose(output)); //Memo1->Lines->Add(Label_date->Caption); //Memo1->Lines->Add(" "); //Memo1->Lines->Text = buf; Memo1->Lines->Add(temp); while(Memo1->Lines->Count >= StrToInt(Edit4->Text) 1) { //Edit_age->Text = "123"; Memo1->Lines->Delete(0); LineOver = 1; //Memo1->Lines->LoadFromFile(filename); } //FILE *output; // 用來指向一個輸出的位置 if(ID_change || Start) { Start = 0; ID_change = 0; AnsiString asFileName = ExtractFileDir(Application->ExeName) AnsiString("\\patient_data\\") Edit_ID->Text AnsiString("_patient.txt"); //ShowMessage(asFileName); output=fopen(asFileName.c_str(),"wt"); fprintf( output, "%s,%s\n",Edit_name->Text.c_str(),Edit_patient->Text.c_str() ); while(0 != fclose(output)); } if(LineOver) { AnsiString asFileName = ExtractFileDir(Application->ExeName) AnsiString("\\measure_data\\") Edit_ID->Text AnsiString("_measure.txt"); //ShowMessage(asFileName); DeleteFile(ExtractFileDir(Application->ExeName) AnsiString(asFileName)); // 刪除檔案 output=fopen(asFileName.c_str(),"wt"); for(i=0;i { fprintf( output, "%s\n",Memo1->Lines->Strings[i].c_str()); } while(0 != fclose(output)); // 這是是不等於,你原來的寫法是錯的 Memo1->Lines->LoadFromFile(AnsiString(asFileName)); // 要自己轉型別才最穩最安全 LineOver = 0; } |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
1/ 除非該檔案被開後,忘了close。
2/ 你根沒有存在對應的目錄夾名。 ExtractFileDir(Application->ExeName) AnsiString("\\measure_data\\") Edit_ID->Text AnsiString("_measure.txt"); ShowMessage(asFileName); 請從showmessage的結果看清楚,你真的有那整串的路徑嗎? 比如說: C:\abc\efg\measure_data\xx_measure.txt 你就要確定,你c下真的有 abc的目錄,而abc裡有efg的目錄,而efg下又有measure_data的目錄。 用眼力仔細的看每個字,一個字錯拼錯就open不會成功!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
b09101015
一般會員 發表:4 回覆:11 積分:3 註冊:2011-01-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |