2011-01-29 13 views
1

我想獲取一個連續的行,用「&」分隔的值加載到多維數組中。這就是我想要做的事情 - 除了包含我的分隔值的字符串「str」,其格式爲「value1,value2,value3等...」之外,所有內容都會在代碼中檢出,只是將整個字符串加載到陣列[0] [0]。我知道有更好的方法可以做到這一點,但我想知道的是爲什麼C++不會將「str」視爲鍵入了單個值和硬編碼「數組」。C++從外部文件的多維數組問題

下面是代碼:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 

using namespace std; 


int main(int argc, char* argv[]) 
{ 

    string str, strTotal; 

    ifstream in; 

    in.open("Desktop/01_001.PAC"); 

    getline(in,str); 
    while (in) { 
     strTotal += str; 
     getline(in,str); 
    } 


    string searchString("&"); 
    string replaceString(", "); 

    assert(searchString != replaceString); 

    string::size_type pos = 0; 
    while ((pos = str.find(searchString, pos)) != string::npos) { 
     str.replace(pos, searchString.size(), replaceString); 
     pos++; 
    } 



    string array[4][5] = {str}; 

    cout << array[0][0]; 

    return(0); 
} 

這裏是外部文件("Desktop/01_001.PAC"):

void&void&void&void&a&a1&a2&a3&b&b1&b2&b3&c&c1&c2&c3&d&d1&d2&d3 

提前感謝!

+0

如果你剛開始學習程序(這聽起來像你是),那麼C++是誠實的你真的可以開始用最糟糕的語言。 – 2011-01-29 23:04:00

+0

我主要用PHP,Javascript等網絡語言編程,昨天剛剛啓動C++。我試圖將PHP的想法應用到C++,它一直是一個活生生的地獄,哈哈...... – tech0234 2011-01-29 23:21:22

回答

0

因爲代碼和數據是不同的東西。您的代碼在運行之前進行編譯。

聽起來好像這是你所期望的:

  1. 該字符串包含文本「富,酒吧,巴茲」。

  2. 聲明string[] whatever = {str};已運行。

  3. 由於「STR」包含「富,酒吧,巴茲」,你希望它有同樣的效果彷彿代碼行實際上string[] whatever = {"foo", "bar", "baz"}

問這樣的問題意味着對編程如何工作的一個完全誤解。

這個神奇的東西在C++中不會發生。它不能,因爲(a)如果你真的想把'str'放到數組中嗎? (b)如果'foo','bar'和'baz'也是你程序中的變量,那麼它們是否應該以同樣的方式解釋呢?

變量名不文本。在您的代碼運行時,它們不再適用於所有實際目的。他們只有在那裏,讓你,作爲一個程序員,可以說「被用來在這裏值應該是被用來在同一個」。

此外,C++ 中的數組初始化並不關心初始化中實際有多少元素與數組的聲明大小。任何其他元素將被默認初始化(即,分配空字符串)。

字符串不能像字符串數組那樣對待,因爲它不是一個。如果你想要一個字符串數組,然後構建它,在確定它們時使用單個字符串元素。

但既然你事先不知道有多少元素也有,你應該使用std::vector不是數組的。你爲什麼試圖將數據排列成二維結構?你如何期待知道它應該如何「廣泛」?

0

如果我正確讀取你的代碼,你似乎在搜索字符串(從文件加載),並且只將最後一個結果賦值給一個數組索引(x = 4,y = 5)。所以,你的代碼做這樣的事情:

while (have not found last variable) 
    search for next variable in string 

assign variable to (4,5) in matrix 

所以,去年分配甚至可能工作,但因爲你只在最後分配,該數組不會被填滿我的思維方式,你希望它是填充。

我打算假設你想要的矩陣總是相同的大小,否則事情會變得更加複雜。在這種情況下,你可以使用這樣的事情:

let xMax = 4 
let yMax = 5 

for (x from 0 to xMax) 
    for (y from 0 to yMax) 
     find the next variable in the string 
     assign it to the current (x,y) location in matrix 

調試語句,在這裏你的朋友!嘗試上述解決方案而不將其保存到數組,而是打印出每個術語,以查看它是否正常工作。

我還要指出,字符串「void」不是C++關鍵字void,所以如果你想要一個數組索引是無效的,就不會工作。嘗試讓您的代碼一開始就沒有空洞地工作。

+0

你剛纔談到的「while」語句部分簡單地用「,」替換源字符串中的「&」 。我在這裏想要完成的是使用外部源聲明 - 「string array [4] [5] = {void,void,void,void,a1,a2等...}」。 – tech0234 2011-01-29 23:13:13