看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) STL 餵入的資料(Input): 我想要從文字檔讀入下列格式的資料 1 5 2 3 8 由左至右為: 編號1的顧客的交易編號為2, 交易長度為2(有兩筆資料) 資料分別為 5, 8 程式碼(Code):(請善用置底文網頁, 記得排版) 先宣告 struct Node { int Customer; //顧客編號 vector <int> Data; //存放顧客交易資料 }; struct TransList { int Transaction; //交易編號 int Length; //交易長度 int *item; //交易資料 }: struct Node *ShowPtr; struct TransList *List1; 首先建一個Node來儲存顧客的交易資料, 接著從文字檔中讀入資料 inFile.read ((char*) &List1->Transaction, sizeof (int)); // 第N筆資料 inFile.read ((char*) &List1->Length, sizeof (int)); // 有資料長度為M List1->item = (int*) calloc (List1->Length, sizeof(int)); for (i = 0 ; i < List1->Length; a++) { inFile.read ((char*) &List1->item[i], sizeof (int)); // 資料 } 故此時應為 List1->Transaction = 5, List1->Length = 2, List1->item[0] = 3, List1->item[1] = 8 ----------------------------------------------------------------------------------------------------------------------- 主要問題是這部分, 準備用另一個副程式存入顧客的Vector ShowPtr->Data.reserve(50); // 因push_back或erase會使iterators失效, 所以先預設 容量, 以防iterators失效 vector <int> ::iterator ivec1; while (List1 != NULL) { for (int i = 0; i < 該顧客有幾筆交易; i++) // 假設只有一筆交易 { for (int j= 0; j < List1->Length ; j++) { ShowPtr->Data.push_back(List1->item[j]); } ShowPtr->Data.push_back(-1); // 用來表示第一筆交易讀完 } ShowPtr->Data.push_back(-2); // 用來表示 該顧客交易全讀完 } 所以顧客的Vector 應存放著 3 8 -1 -2 然後我用ivec1指向ShowPtr->Data.begin(); 此時*ivec1 應為 3 卻還是出現iterators失效, 我有先預設容量可放50筆資料, 目前只放4筆(3 8 -1 -2) 照 理Vector不用重新分配記憶體, 但iterators卻還是失效 補充說明(Supplement): 另外後來想改用List (想說不用擔心iterators失效的問題), 反而還出現0xC0000005「違 反記憶體使用權」的錯誤的產生 以上兩個問題, 勞請各位版友解惑了... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.134.18.157
akasan:STL 不能直接這樣讀寫, 會無法正確初始化 01/28 16:06
akasan:keyword "c++ stl serialization" 01/28 16:06
BearTsao:不太懂(直接讀寫?), 不過感謝樓上給keyword 01/28 16:15
diabloevagto:你要不要把你的程式弄成一個可以跑得...有點看不太懂 01/28 16:28
akasan:oop, 發現看太快有所誤會XD 不過關鍵字應該是有用的 01/28 16:29
akasan:ShowPtr 不會是弄成 calloc 要記憶體了吧? 01/28 16:31
BearTsao:如果讀到新的顧客,會calloc一塊記憶體,存放該顧客vector 01/28 16:44
akasan:C++ 請用 new 01/28 16:52
BearTsao:還是Vector只能放純數值,不能放指標List1->item[i]? 01/28 16:53
littleshan:你用純文字存資料,怎麼會用read來讀取咧 01/28 16:58
littleshan:inFile >> List1->Transaction 這樣才對吧 01/28 16:59
BearTsao:改用new 和 >> 試試 @@ 01/28 17:07
BearTsao:說錯了, 我是讀binary @@ 01/28 17:38
diabloevagto:你在push_back裡面放入showptr->item,但是你的 01/28 18:10
diabloevagto:是node,裡面那來的item? 01/28 18:11
diabloevagto:是不是該用list1->item[j] 01/28 18:11
※ 編輯: BearTsao 來自: 140.134.18.155 (01/28 18:25)
BearTsao:漏掉, 忘了改@@ 01/28 18:26
diabloevagto:你要不要把能跑的程式貼上來...這樣比較好找問題 01/28 18:33
WJAider:我只是單純不喜歡後面補 -1 & -2 的規則...很 C... 01/28 19:11
WJAider:在插入資料時, ivec1 完全沒有動到 01/28 19:14
WJAider:所以應該不是記憶體位置問題 01/28 19:14
WJAider:把 ivec1 = ShowPtr->Data.begin(); 那部分程式碼貼上吧 01/28 19:15
diabloevagto:他有用上push_back 01/28 20:09
blackwindy:你應該用new,只有malloc的話vector會初始化嗎? 01/28 20:30
diabloevagto:我覺得架構怎麼不用vector就好,裡面不要放int,放你 01/28 20:34
diabloevagto:所需要的class就好 01/28 20:34
BearTsao:可行了, 沒想到new 和 calloc 會影響這麼大@@ 01/29 17:03