#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 согласен.