2011-02-15 305 views
1
2  1  3  6 0 9 0 
     2  9  5 0 0 8 
     3 10  0 6 0 6 
    3  1  1  0 4 0 8 
     2  1  7 0 0 8 
     3  5  0 4 0 5 
    4  1  3  10 0 0 7 
     2  5  7 0 2 0 
     3  8  6 0 0 7 
    5  1  4  0 9 8 0 
     2  6  2 0 0 7 
     3 10  0 5 0 5 
    6  1  2  2 0 8 0 

我有很多文本文件。格式就像上面那樣。我希望將每列數據存儲到不同的數組中,例如,col01[5] ={2,3,4,5,6}(對應於第1列)。我怎樣才能做到這一點? col02[15] ={1,2,3......}(對應於第二列數據)。從文本文件中讀取數據

第一列中的數字不固定,位置也是隨機的。例如,第一列中的數字隨機位於一些行中。列號是固定。它可能是以下格式:

2  1  3  6 0 9 0 
    2  2  9  5 0 0 8 
     3 10  0 6 0 6 
    3  1  1  0 4 0 8 
     2  1  7 0 0 8 
    5  3  5  0 4 0 5 
    4  1  3  10 0 0 7 
     2  5  7 0 2 0 
     3  8  6 0 0 7 
    5  1  4  0 9 8 0 
     2  6  2 0 0 7 
     3 10  0 5 0 5 
    6  1  2  2 0 8 0 

我試圖用istringstreamgetline但它太複雜了。感謝

+0

你能再細說一下嗎?我仍然不確定你想如何存儲你的數據。那麼每行有18個數字? – user607455 2011-02-15 03:12:28

+0

這意味着每行有7個數字。第一列每3行缺少2個數字。你想把它分成7列? – user607455 2011-02-15 03:21:31

+0

我可以看到你想要的東西。但是如何以編程方式執行它將取決於文件的格式。什麼是間距蜂窩單元的定義,NULL單元的定義是什麼。 col1不會是{2,NULL,NULL,3,NULL,NULL,4,NULL,NULL,5,NULL,NULL,6}; – 2011-02-15 03:24:35

回答

2

更簡單和更有效的方法是按字符掃描文件字符,即增加「我」a並比較每個值。 if(i ==「」)//如果字符是「」空格則不做任何事 /\/\ if(i == 10)//如果字符是ASCII(10),即ENTER則切換到COL01 /\/\ else繼續將COLITS存儲在col01中,然後將col02存儲在col07上。

這是您問題解決方案的摘要。 希望它有幫助。 如果它現在不讓我,我會很樂意再次幫助。

0
# include < iostream> 
# include < fstream> 
using namespace std; 
int main() 
{ 
    char ch; 
    char str[256]; 
    ofstream fout("test.dat"); 
    if(!fout) { 
    cout << "Cannot open file for output.\n"; 
    return 1; 
    } 
    fout << "This is a line of text.\n"; 
    fout << "This is another line of text.\n"; 
    fout << "This is the last line of text.\n"; 
    fout.close(); 
    if(!fout.good()) { 
    cout << "An error occurred when writing to the file.\n"; 
    return 1; 
    } 
    ifstream fin("test.dat", ios::in); 
    if(!fin) { 
    cout << "Cannot open file for input.\n"; 
    return 1; 
    } 
    cout << "Use get():\n"; 
    cout << "Here are the first three characters: "; 
    for(int i=0; i < 3; ++i) { 
    fin.get(ch); 
    cout << ch; 
    } 
    cout << endl; 
    fin.get(str, 255); 
    cout << "Here is the rest of the first line: "; 
    cout << str << endl; 
    fin.get(ch); 
    cout << "\nNow use getline():\n"; 
    fin.getline(str, 255); 
    cout << str << endl; 
    fin.getline(str, 255); 
    cout << str; 
    fin.close(); 
    if(!fin.good()) { 
    cout << "Error occurred while reading or closing the file.\n"; 
    return 1; 
    } 
    return 0; 
} 
+0

你可以在編輯器中標記你的代碼並按下CTRL-K縮進它(必須以4或更多的空格開頭,並在空白行前面,爲你修好了,歡呼聲 – paxdiablo 2011-02-15 03:15:38

1

保留std::map<int,std::vector<int>>,將整數與它們所在的列配對。通讀每一行直到找到一個數字。您需要手動執行此操作,但不能使用operator>>。您需要閱讀數字末尾以確定它所在的列,然後:the_map[the_column].push_back(the_number);

1

對於此特定問題。

聲明13個空格的7列。

閱讀一行。 如果第一個字符不是空格,則第一個數字將轉到第一個字符。 讀到下一個數字。去第二列。 重複。