我需要使用C++在帶空格的文本中讀入數字值。將混合數據的文件讀入C++字符串
例如,看起來像數據:
text1
1.0
text two
2.1
text2 again
3.1
不能與2個"infile >>"
語句讀入。我沒有任何運氣getline
要麼。我最終希望用這兩個數據元素填充struct
。有任何想法嗎?
我需要使用C++在帶空格的文本中讀入數字值。將混合數據的文件讀入C++字符串
例如,看起來像數據:
text1
1.0
text two
2.1
text2 again
3.1
不能與2個"infile >>"
語句讀入。我沒有任何運氣getline
要麼。我最終希望用這兩個數據元素填充struct
。有任何想法嗎?
標準IO庫不會爲您單獨完成此工作,您需要對數據進行一些簡單的解析以確定文本結束位置和數值開始的位置。如果你可以做一些簡化的假設(比如說每行只有一個文本/數字對,並且錯誤恢復最小),那麼將整個事件整理成一個字符串然後手動掃描就不會太糟糕。否則,你最好使用正則表達式或解析庫來處理這個問題,而不是重新發明輪子。
如果你能確定你的輸入格式良好的,你可以嘗試這樣的例子:
#include <iostream>
#include <sstream>
int main()
{
std::istringstream iss("text1 1.0 text two 2.1 text2 again 3.1");
for (;;)
{
double x;
if (iss >> x)
{
std::cout << x << std::endl;
}
else
{
iss.clear();
std::string junk;
if (!(iss >> junk))
break;
}
}
}
如果您還必須驗證輸入(而不是僅僅試圖解析東西看起來像一個雙重的),你將不得不寫一些解析器,這不難,但無聊。
爲什麼?您可以使用getline提供空格作爲行分隔符。如果下一個是數字,則拼接提取的部分。
僞代碼。
這應該工作。不過,它假設你有文字/數字。你也必須做一些簡單的工作,讓所有的打字都很開心。
while(! eof)
getline(textbuffer)
getline(numberbuffer)
stringlist = tokenize(textbuffer)
number = atof(numberbuffer)
也許我不記得std :: string的操作符>>的語義是否正確,但是沒有在文本字段中收集任何空格? – 2008-11-19 18:30:26