C++ 使用>>运算符无法正确读取文件中的数据

C++ 使用>>运算符无法正确读取文件中的数据,c++,C++,我有一个数据文件,每行有3列:两个3个字符的字符串和一个这样的浮点 AAA BBB 699.25 我尝试使用ifstream读取数据,如下所示: ifstream input; char str1[3], str2[3]; float num; input.open("data.txt"); input >> str1 >> str2 >> num; cout << str1 <<

我有一个数据文件,每行有3列:两个3个字符的字符串和一个这样的浮点

AAA BBB 699.25
我尝试使用ifstream读取数据,如下所示:

    ifstream input;

    char str1[3], str2[3];
    float num;

    input.open("data.txt");

    input >> str1 >> str2 >> num;
    cout << str1 << endl;
    cout << str2 << endl;
    cout << num << endl;

或英特尔C++:

AAABBB
BBB
699.25

如果我在没有多个>>运算符的情况下获得单个变量,则所有变量都能正常工作。我猜我不明白>>是如何工作的,当我将更多数据放入数组时,它会覆盖缓冲区中的数据。

字符串AAA不是三个字符长。您有三个可见字符和一个不可见的空字符。这意味着要持有AAA,您需要四个字符的存储空间。如果您使用std::string,这就不是问题了,因为它会为您处理类似的事情。因为你只是把这个标记为C++,我会改变字符STR1(3),STR2(3);到std::字符串str1,str2

字符串AAA不是三个字符长。您有三个可见字符和一个不可见的空字符。这意味着要持有AAA,您需要四个字符的存储空间。如果您使用std::string,这就不是问题了,因为它会为您处理类似的事情。因为你只是把这个标记为C++,我会改变字符STR1(3),STR2(3);到std::字符串str1,str2

你为什么要用这么小的缓冲区?两个字符加上一个null并没有很大的空间。@塔德曼,我对C++是相当新的,所以我想我会使用我所需要的确切大小而不考虑任何隐藏字符。问题已解决。从标准输入读取时,不需要精确的大小。你对输入的内容没有控制权,所以它可能是两个字节,或者两个千兆字节。使用std::string。固定大小的缓冲区几乎总是会让你吃力。除非你别无选择,否则不要使用它们。奇怪。。。运算符>>返回一个istream&,它与调用它的对象相同,因此标准上应该没有差异。但正如@tadman所说,您根本没有分配足够的内存来存储输入。安全和正确的程序比保存几个字节更重要。如果您是新手,我建议您使用std::vector和std::string而不是数组。这会帮你省去很多痛苦。你有什么理由使用这么小的缓冲区吗?两个字符加上一个null并没有很大的空间。@塔德曼,我对C++是相当新的,所以我想我会使用我所需要的确切大小而不考虑任何隐藏字符。问题已解决。从标准输入读取时,不需要精确的大小。你对输入的内容没有控制权,所以它可能是两个字节,或者两个千兆字节。使用std::string。固定大小的缓冲区几乎总是会让你吃力。除非你别无选择,否则不要使用它们。奇怪。。。运算符>>返回一个istream&,它与调用它的对象相同,因此标准上应该没有差异。但正如@tadman所说,您根本没有分配足够的内存来存储输入。安全和正确的程序比保存几个字节更重要。如果您是新手,我建议您使用std::vector和std::string而不是数组。这会帮你省去很多痛苦。
AAABBB
BBB
699.25