0

这已经给我带来了一段时间的麻烦,而且我对代码所做的任何调整似乎都没有产生任何影响。我试图在从文件中读取的一行文本中定位数字,并将所述数字存储到另一个字符串中以供以后使用。最初的复制似乎是成功的,但是当尝试输出存储数字的字符串时,唯一的输出是一个空行。

这是代码和包含的头文件:

#include<iostream>
#include<string>
#include<fstream>
#include<cctype>

using namespace std;

int main()
{
    ifstream inFile;
    string temp;
    short count = 0;
    char fileName[20];  
    string info1;

    cout << "Enter the name of the file to be used: " << endl;
    cin >> fileName;

    inFile.open(fileName);

    if(!inFile)
    {
        cout << "Error opening file." << endl;      
    }
    else
    {           
        getline(inFile, info1);
        cout << info1 << endl;

        for(short i = 0; i < info1.length(); i++)
        {
            if(isdigit(info1[i]))
            {   
                temp[count] = info1[i];
                cout << temp[count] << endl;
                count++;
            }
        }
        cout << temp << endl;
    }   
    inFile.close();
    return 0;
}

输出如下:

Enter the name of the file to be used:
input.txt
POPULATION SIZE: 30
3
0

显然,它没有按预期输出温度。任何帮助或建议将不胜感激。

4

3 回答 3

1

问题是这temp不是简单的字符数组。这是std::string类。最初temp是空的。这意味着我们不知道为字符串分配了多少内存。std::string::operator[]它甚至可以是 0。那么当您使用as 应用于空字符串时,应该返回什么符号的参考?

您应该改用std::string::operator+=or char 数组。

于 2012-11-03T12:06:27.610 回答
1

实际上,它确实输出了这个temp值——只有这个值是一个空字符串。考虑一下:

  string str = "A";
  for (int i=0; i < 2; i++)
  {
    str[i] = 'B';  
    cout << str[i] << endl;
  }
  cout << "And the final result is..." << str;

这将输出两个Bs (通过内部循环的 s cout),但最终结果的字符串将只有一个 s B。这样做的原因是它operator[]不会“扩展”字符串 - 它可以用作设置器来替换该字符串的字符,但仅适用于已经在字符串中的索引:它不会为该字符串分配额外的内存以防万一索引溢出。

因此,要构建您的字符串,您可以使用另一个运算符 - +=(连接分配):

  string str;
  for (int i=0; i < 2; i++)
  {
    str += 'B';  
    cout << str[i] << endl;
  }
  cout << "And the final result is..." << str;

BB这将作为最终结果打印。

于 2012-11-03T12:05:44.257 回答
0

使用这个,
temp+=info1[i];
而不是
temp[count] = info1[i];

于 2012-11-03T11:59:54.830 回答