【问题标题】:how to assign data from text file into structs c++如何将文本文件中的数据分配到结构C++中
【发布时间】:2020-12-20 09:20:57
【问题描述】:

我想将文件的内容分配到结构中,但我不断收到此错误,如果有人知道如何将数据逐行分配到结构数组中,请告诉我。

error: invalid operands to binary expression ('basic_ostream<char, std::__1::char_traits<char> >' and 'const char [2]')

我不知道是什么问题。这是代码:

#include <cstdlib>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <istream>
#include <ostream>
using namespace std;

struct StudentInfo {
    char fname[30];
    char lname[30];
    int id;
    char address[30];
    char PhoneNumber[20];
};

void read_file() {
    ifstream data("text.txt");
    StudentInfo array[11];
    if(!data.fail) {
        int i;
        for(int i = 0; i <= 11; i++) {
            data >> array[i].fname;
            data >> array[i].lname;
            data >> array[i].id;
            data >> array[i].address;
            data >> array[i].PhoneNumber;
        }
        for(int i = 0; i <= 11; i++) {
            cout << array[i].fname >> " " << array[i].lname << " " << array[i].id >>
                " " << array[i].address >> " " << array[i].PhoneNumber;
        }
    }
}

void print_student(StudentInfo s) {
    cout << s.fname >> " " << s.lname >> " " << s.id >> " " << s.address >>
        " " << s.PhoneNumber;
}

void search(StudentInfo array[]) {
    int sid;
    //    string last;
    cout << "Enter id";
    cin >> sid;
    for(int i = 0; i < 1000; i++) {
        if(array[i].id == sid) {
            print_student(array[i]);
        }
    }
}

int main() {
    StudentInfo array[11];
    read_file();
    search(array);

    return 0;
}

【问题讨论】:

  • &lt;= 11 ... 越界

标签: c++ stream operator-overloading


【解决方案1】:

此声明

cout<<array[i].fname>>" "<<array[i].lname<<" "<<array[i].id>>" "<<array[i].address>>" "<<
            array[i].PhoneNumber;

没有意义。事实上,由于在这部分使用了两个运算符 >

cout<<array[i].fname>>" "

你的陈述

std::cout >> " "

但没有为输出流 std::cout 定义运算符 >>。

看来你的意思

cout<<array[i].fname << " "
                     ^^^

语句中您错误使用运算符的所有地方>>。

如果您有一个包含 11 个元素的数组,请注意这一点

StudentInfo array[11];

那么索引的有效范围是[0, 11 )。那就是使用索引 11 来访问数组之外​​的内存。

for(int i = 0; i <= 11; i++) {
            data >> array[i].fname;
            //...

【讨论】:

    【解决方案2】:

    首先,您的迭代将超出索引

    for (int i=0; i<=11;i++) // it would try to access invalid index
    for (int i=0; i<11;i++)  // you should try this instead
    

    其次,您必须按如下方式更正该行:

    if(!data.fail) // It won't work
    if(!data.fail()) // You have to use this
    

    第三,您还必须将这一行更改如下

    cout<<array[i].fname>>" "<<array[i].lname<<" "<<array[i].id>><<array[i].address>>" "<<
            array[i].PhoneNumber;   // This line should be removed
    cout<<array[i].fname<<" "<<array[i].lname<<" "<<array[i].id<<" " <<array[i].address<<" "<<
            array[i].PhoneNumber; // This line should be added
    

    【讨论】:

    • 注意:if(!data.fail()) 不如if(data)
    • @TedLyngmo 同意。
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多