как назначить данные из текстового файла в структуры c

#c #stream #operator-overloading

#c #поток #оператор-перегрузка

Вопрос:

Я хочу назначить содержимое файла в структуры, но я продолжаю получать эту ошибку, и если кто-нибудь знает, как назначить данные в массивы структур построчно, пожалуйста, скажите мне также.

 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;
}
  

Комментарии:

1. <= 11 … за пределами

Ответ №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
  

Комментарии:

1. Примечание: if(!data.fail()) было бы лучше, поскольку if(data)

2. @TedLyngmo согласен.