【问题标题】:C++ cin.getline to char arrayC++ cin.getline 到 char 数组
【发布时间】:2014-08-25 14:13:04
【问题描述】:

我已经声明了一个数组:names[1000]; 和另一个数组data[1000];,用于临时存储数据

后来使用ifstreamXML 文件中读取数据。

后来,我使用cin.getline(data, 300)将数据放入data[]数组中。

但是当我将data[] 数组分配给names[] 数组时,出现错误:

invalid operands of types char[1000] and char[1000] to binary operator>>

代码:

char data[1000];
char names[1000];


ifstream openFile("myfile.xml");

if(!openFile)
{
    cout<<"File not found! please re-enter filename"<<endl;
}

while (openFile.getline (data, 300))
{
    if (data[0] == '<' && data[1] == 'n') // to only check the <name> xml tag
    {
        cout<<data<<endl;
        data >> names;
    }
}

知道为什么我不能将数据数组分配给名称数组吗?

谢谢!

【问题讨论】:

  • 你为什么使用 C 风格的字符串而不是 std::string
  • 我必须使用数组来检查( [0] =='
  • 当然,您可以使用适当的 C++ 字符串 (std::string) 以及您可能想要使用旧式 C 字符串执行的任何其他操作。但不同之处在于,使用std::string 会更容易、更安全/更健壮。
  • @taurette 您可以使用 C++ 字符串轻松做到这一点。
  • @taurette 您可以使用std::string 来做到这一点(即使用[] 进行索引,只需先检查长度)。

标签: c++ arrays ifstream getline


【解决方案1】:

">>" 运算符通常是为流定义的,但 data 只是一个数组。 如果要复制内容,请使用 string.h 中的 strncpy:

strncpy(names, data, 1000);

如果您想将字符串/数组视为流,请尝试使用 stringstream。

顺便说一句,您可能希望使用 C++ 字符串而不是字符数组——它更方便(但效率不高)。

【讨论】:

【解决方案2】:

运算符&gt;&gt; 不用于赋值!您可以像这样使用strncpy 进行分配

strncpy(names, data, 1000);

并添加包含

#include <string.h>

【讨论】:

  • 数组名不是左值,因此不能赋值。
  • 我的意思是分配指针,使它们指向同一个容器。但是我现在看到这将是一个问题,因为在读取新行时内容将被删除。所以strncpy 是解决方案。编辑我的答案
  • 来自链接; “如果表达式a(这是一个int [10])出现在不是sizeof或&运算符的操作数的上下文中,那么它的类型被隐式转换为int *,它的值是第一个元素。”
  • 确实如此。但是转换会产生一个右值,如果您愿意,可以是一个临时值,根据定义,它不能分配给原生类型。
【解决方案3】:

因为你不能分配数组。完全没有。

您可能想看看std::vectorstd::string,它们可以与其他很酷的东西一起分配。

如果您想坚持使用char 数组,您可以执行以下操作:

std::copy(std::begin(data), std::end(data), std::begin(names));

或者(避免在第 300 个元素之后复制垃圾):

std::copy(std::begin(data), std::begin(data) + 301, std::begin(names));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多