什麼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
。矢量是聰明的。他們長得很適合。他們知道他們有多少東西。他們照顧自己,所以沒有不必要的new
和delete
廢話。你不應該使用它們。
閱讀:
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
循環不太方便。
您的問題的答案是「是」。如果你需要更多的細節,你應該提供你已經嘗試過的東西,並指出你卡住的地方,並覺得有問題。 –