2016-03-09 77 views
0

如果沒有意義,我表示歉意。我不知道要谷歌什麼。將2個結構數組輸出到一個文件中

可以說我有兩個陣列

string a_1[16]; 
string a_2[20]; 

我需要輸出這些到文件與函數,第一,A_1 [0]至A_1 [N]。 然後讀入a_2。

也可以再次運行該函數,以將更多的a_1和a_2添加到輸出文件中。

這樣的格式是:

//output_file.txt 

a_1[0].....a_1[n] 
a_2[0].....a_2[M] 
a_1[n+1]...a_1[16] 
a_2[M+1]...a_2[20] 

我的問題是。有沒有一種方法可以讀取output_file.txt,以便讀取所有a_1中的a_1 [0]到a_1 [16]。 然後輸入a_2 [0]到a_2 [20]。

也許只是把各組之間的「東西」,這樣當讀取「東西」,它知道要停止閱讀A_1的,並切換到閱讀在A_2 ....

+1

您的問題的答案是「是」。如果你需要更多的細節,你應該提供你已經嘗試過的東西,並指出你卡住的地方,並覺得有問題。 –

回答

1

什麼OP電話「東西」通常稱爲哨兵或金絲雀值。要用作標記,必須找到數據流中不存在的模式。這很難,因爲幾乎任何東西都可以放在字符串中。如果您使用「XxXxXx」作爲標記,那麼您必須非常小心,它永遠不會寫入文件。

可以在這裏使用轉義字符(查看它)的概念,但更好的方法可能是在文件的開頭存儲已存儲字符串的計數。假設有這樣

4 
string a1_1 
string a1_2 
string a1_3 
string a1_4 
2 
string a2_1 
string a2_2 

的輸出文件中讀取續,四,然後讀取數字符串,然後讀取下一個計數,然後讀取計數多個字符串

好了,你在想他吮吸。我不能只在a1中插入一個新的字符串,而不改變文件前面的數字。

好吧,將數據插入文件中間而不用完全擦除文件,祝你好運。它可以完成,但只有在插入之後的所有內容都移動了插入的大小之後,這並不像聽起來那麼微不足道。在編程生涯中,這是你分配的任務,你必須尋求幫助,你幾乎註定要將文件讀入內存,插入新值並寫回文件再次出來,所以就去吧。

那麼這在代碼中看起來像什麼?首先,我們拋開陣列而傾向於std::vector。矢量是聰明的。他們長得很適合。他們知道他們有多少東西。他們照顧自己,所以沒有不必要的newdelete廢話。你不應該使用它們。

閱讀:

std::ifstream infile(file name); 
std::vector<std::string> input; 
int count; 
if (infile >> count) 
{ 
    infile.ignore(); // discard end of line 
    std::string line; 
    while (input.size() < count && getline(infile, line)) 
    { 
     input.push_back(line); 
    } 
    if (input.size() != count) 
    { 
     //handle bad file 
    } 
} 
else 
{ 
    // handle bad file 
} 

,寫

std::ofstream outfile(file name); 
if(outfile << output.size()) 
{ 
    for (std::string & out: output) 
    { 
     if (!outfile << out << '\n') 
     { 
      // handle write error 
     } 
    } 
} 
else 
{ 
    // handle write error 
} 

但這樣子的功課,所以OP的可能不允許使用的。在這種情況下,邏輯是一樣的,但你必須

std::unique_ptr<std::string[]> inarray(new std::string[count]); 

std::string * inarray = new std::string[count]; 

分配你在閱讀的字符串存儲。第二個看起來比第一少工作。看起來很騙人。第一個照顧你的記憶。第二個代碼需要至少一個delete[]以正確的速度放置內存。錯過它,你有內存泄漏。

你還需要有一個變量來跟蹤數組的大小,因爲指針不知道它們指向的是多大。這使寫入for循環不太方便。

相關問題