“cout”不适用于字符串

时间:2014-11-29 05:55:05

标签: c++

大家好我在Visual C ++ 2013中打印字符串内容时遇到问题 如您所见,代码很简单:

#include <iostream>
#include <string>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{   
    ifstream file("d:\\t.txt");
    if (file.is_open())
    {
      string a[5];
      for (int i = 0; i < 5; ++i)
      {
        file >> a[i];
      }
    }
    cout<< a;
    system("pause");
}

我收到以下错误:

1>------ Rebuild All started: Project: Project3, Configuration: Debug Win32 ------
1>  Source.cpp
1>c:\users\malatrab\documents\visual studio 2013\projects\project3\source.cpp(14): error C2065:   'a' : undeclared identifier
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

所以请关于这个问题的任何想法。编译器无法识别字符串变量a。

4 个答案:

答案 0 :(得分:2)

在您使用它的范围内没有任何名为a的内容。

还要注意cout不直接支持数组的输出(char数组除外)。将这样的数组直接传递给cout输出操作,它衰减到指向第一个项目。所以当你修复了主要问题时,你需要做一些循环来输出这些字符串。

答案 1 :(得分:2)

要将a放在范围内,请在if语句之前初始化它。 此外,a是一个数组,您必须指定要访问的位置。 在这种情况下,循环指定值0到4,一次一个。

 ifstream file("d:\\t.txt");
 string a[5];
 if (file.is_open())
    {
       for (int i = 0; i < 5; ++i)
          {
             file >> a[i];
          }
    }
 for (int i = 0; i < 5; ++i)
 {
    cout << a[i];
 }
 system("pause");

答案 2 :(得分:1)

a不是std::string,而是std::string的数组。但是,编译器真的在抱怨范围。您在if { }块中声明了它,但尝试在外部块中使用它。其次,你不必在这里处理数组,特别是如果你打算从文件中读取数据。使用std::vector代替,几乎没有开销。

std::vector<std::string> a;
if (file.is_open())
{
  std::string word;
  while (file >> word)
    a.push_back(word);
}

答案 3 :(得分:1)

如果

,则数组a具有语句的块范围
    if (file.is_open())
    {
      string a[5];
      for (int i = 0; i < 5; ++i)
      {
        file >> a[i];
      }
    }

然后控件被传递到复合语句之外,如果数组将被销毁并且标识符a将不可见。

还有另一个问题。我想你想在这个语句中输出数组的每个元素

    cout<< a;

而不是数组第一个元素的地址。

以下列方式改写主要

int main()
{
    const size_t N = 5; 
    string a[N];

    ifstream file("d:\\t.txt");

    if (file.is_open())
    {
        for ( size_t i = 0; i < N; ++i )
        {
            file >> a[i];
        }
    }

    for ( size_t i = 0; i < N; ++i )
    {
        cout << a[i] << endl;
    }

    system("pause");
}

您可以使用基于范围的语句输出数组

for ( const auto &s : a ) cout << s << endl;

此外,您应该编写像

这样的C标头
#include <cstdio>
#include <cstdlib>

由于程序中没有使用标头<cstdio>的声明,因此您可以删除相应的#include指令。