【问题标题】:C++ Multi dimensional array from external file question来自外部文件问题的 C++ 多维数组
【发布时间】:2011-01-29 21:46:29
【问题描述】:

我正在尝试获取一条由“&”分隔的值的连续行,以加载到多维数组中。这是我尝试做的方式 - 代码中的所有内容都检查出来,除了字符串“str”,它包含格式为“value1,value2,value3,etc...”的分隔值,只是将整个字符串加载到数组[0][0]。我知道有更好的方法可以做到这一点,但我想知道的是为什么 C++ 不会将“str”视为我输入了单独的值和硬编码的“数组”。

代码如下:

#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

提前致谢!

【问题讨论】:

  • 如果你只是在学习编程(听起来你就是这样),那么 C++ 确实是你可能开始使用的最糟糕的语言。
  • 我主要使用 PHP、Javascript 等 Web 语言进行编程,昨天才开始使用 C++。我正在尝试将 PHP 的想法应用到 C++ 中,它一直是一个活生生的地狱,哈哈...

标签: c++ arrays


【解决方案1】:

因为代码和数据是不同的东西。您的代码在运行之前已编译。

听起来好像这是你所期望的:

  1. 字符串包含文本“foo, bar, baz”。

  2. 运行语句string[] whatever = {str};

  3. 由于“str”包含“foo, bar, baz”,您希望它具有相同的效果就像代码行实际上是 string[] whatever = {"foo", "bar", "baz"}

问这样的问题意味着完全误解了编程的工作原理。

在 C++ 中不会发生这种神奇的事情。它不能,因为 (a) 如果您真的想将 'str' 放入数组中怎么办? (b) 如果 'foo'、'bar' 和 'baz' 在你的程序中也是变量——它们应该以同样的方式解释吗?

变量名称不是文本。出于所有实际目的,它们在您的代码运行时不再存在。它们的存在只是为了让作为程序员的您可以说“here 上使用的值应该与 there 上使用的值相同”。 p>

此外,C++ 中的数组初始化不关心初始化中实际有多少元素与声明的数组大小。任何其他元素都将被默认初始化(即分配空字符串)。

字符串不能被视为字符串数组,因为它不是一个。如果您想要一个字符串数组,则使用您确定的各个字符串元素来构建它。

但由于您事先不知道有多少个元素,因此您应该使用std::vector 而不是数组。你为什么要尝试将数据排列成二维结构?你怎么知道它应该有多“宽”?

【讨论】:

  • 我知道变量名不是文本。我正在尝试使用外部文件声明字符串数组 [4] [5]。如果我要设置它并对值进行硬编码,我会输入“string array[4][5] = {void, void, void, void, a1, a2, etc...};”另外......我知道向量,我只是好奇为什么我不能将变量的值替换为字符串数组声明。
  • 首先,不,你不会这么说,因为'void'不能那样工作。其次,不,您不会这样说,因为例如“a2”是一个字符串而不是变量名。第三,答案非常专注于解释为什么你不能这样做:因为你没有理由合理地期望它起作用。这根本没有任何意义。就语义而言,您可以做的最接近的事情是将所有 20 个字符串读入单独的变量,然后在初始化语句中使用它们,但这非常混乱。
  • void 只是一个示例值,而不是一个函数......抱歉造成混淆。我想我的问题是我认为声明字符串数组和 int 数组只会在多个字符与数值的情况下以相同的方式工作......结果,我得到了一整串编译错误。无论如何......我的问题仍然存在,为什么我不能用包含相同代码字符串的变量替换数组声明的硬代码值?即:替换“int array[4][5] = {1, 2, 3, 4, 5, etc...};”与“int数组[4][5] = {variable1};”并有 'string variable1 = "1, 2, 3, 4, 5, etc..";'上面?
  • 因为它们不是同一类型。该数组是一个字符串数组。它包含多个字符串。每个元素都是一个字符串。变量是一个字符串。它有一个字符串。因此,它可以表示一个元素,但不能表示“数组的全部内容”。字符串与字符串数组不同。你的问题类似于:“我有这个书架,我有一本带有精美防尘罩的书,它的装饰看起来好像上面有一堆书。为什么我不能装满我的书- 书架上,并排着画在防尘罩上的书?”
【解决方案2】:

如果我正确阅读了您的代码,您似乎正在搜索字符串(从文件加载),并且只将最后一个结果分配给数组索引(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,因此如果您希望数组索引为 void,则它不起作用。首先尝试让您的代码在没有空白的情况下工作。

【讨论】:

  • 您首先使用“while”语句讨论的那部分只是将源字符串中的“&”替换为“,”。我在这里尝试完成的是等效于声明 - “字符串数组 [4] [5] = {void, void, void, void, a1, a2, etc...}” 使用外部源。跨度>
  • 顺便说一句:我只是将“Void”放在文本文件中作为示例值,我无意使用 C++ 关键字。
猜你喜欢
  • 2020-02-04
  • 2021-10-30
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
相关资源
最近更新 更多