2011-01-29 11 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