mariaclara Ответов: 1

Как вставить входные данные из объекта struct в файл?


Я работал над этим кодом, все было хорошо, пока компилятор не выдал мне ошибку C:\Users\dcst\Desktop\file\main.cpp/108/error: нет совпадений для 'оператора&ЛТ;&ЛТ;' в 'Коллекция &ЛТ;&ЛТ; ви'| и я не могу продолжать работать над другими вещами, если я не могу сделать этот метод правильно.



#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>

using namespace std;

struct students{
    string studentID;
    string surname;
    string firstname;
    string birthdate;
    string sex;
};

int main()
{
    fstream collection;
    string filename;
    short choice;



    do{
        int ctr=1;
        system("cls");
        if(collection.is_open()){
                cout<<"Active File: ["<<filename<<"]"<<endl;
        }else{
                cout<<"Active File|: [None opened]"<<endl;
        }

        cout<<"[1] Create new file"<<endl;
        cout<<"[2] Open existing file"<<endl;
        cout<<"[3] Manage data"<<endl;
        cout<<"[4] Exit"<<endl;
        cout<<"Enter operation index: ";
        cin>>choice;
        switch(choice){
        default:
            cout<<"Invalid input."<<endl;
            system("pause");
            choice=4;
            break;
        case 1:
            cout<<"Enter file name: ";
            cin>>filename;
            collection.open(filename, std::fstream::in | std::fstream::out | std::fstream::app);
            collection<<"------------------------------------------------------------------------------"<<endl;
            collection<<"Rec \t Student ID \t Surname \t Firstname \t Birthdate \t Sex \t"<<endl;
            collection<<"------------------------------------------------------------------------------"<<endl;
            collection.close();
            collection.open(filename, std::fstream::in | std::fstream::out | std::fstream::app);
            break;
        case 2:
            cout<<"Enter file name: ";
            cin>>filename;
            collection.open(filename, std::fstream::in | std::fstream::out | std::fstream::app);
            break;
        case 3:
            string lines;
            char menu;
            students student[10];

            do{
                if(collection.is_open()){
                    cout<<"Active File: ["<<filename<<"]";
                    system("cls");
                    while(getline(collection,lines)){
                    cout<<lines<<endl;
                    }
                }
                collection.close();
                collection.open(filename, std::fstream::in | std::fstream::out | std::fstream::app);


                cout<<"[A]dd  [E]dit [D]elete  [S]ort  [F]ilter  Sa[V]e  e[X]it"<<endl;
                cout<<"Enter operation: ";
                cin>>menu;

                if(menu=='A'){
                    string lines2;
                    int one;
                    int two;
                    collection.open(filename,ios::app);
                    system("cls");

                    ifstream collection(filename, std::fstream::in | std::fstream::out | std::fstream::app);
                        if(collection.is_open()){
                            while(getline(collection,lines)){
                                cout<<lines<<endl;
                            }
                        }
                    collection.close();

                    cout<<endl<<"Adding data to "<<filename<<endl;
                    cout<<"Student ID: ";
                    cin>>student[ctr].studentID;
                    cout<<"Surname: ";
                    cin>>student[ctr].surname;
                    cout<<"Firstname: ";
                    cin>>student[ctr].firstname;
                    cout<<"Birthdate: ";
                    cin>>student[ctr].birthdate;
                    cout<<"Sex: ";
                    cin>>student[ctr].sex;

                    collection.open(filename, std::fstream::in | std::fstream::out | std::fstream::app);
                    collection<<ctr<<"\t"<<student[ctr].studentID<<"\t"<<student[ctr].surname<<"\t"<<student[ctr].firstname<<"\t"<<student[ctr].birthdate<<"\t"<<student[ctr].sex<<endl;
                    collection.close();
                    system("pause");
                    ctr++;
                    collection.open(filename, std::fstream::in | std::fstream::out | std::fstream::app);

                }else if(menu=='E'){

                }else if(menu=='D'){

                }else if(menu=='F'){

                }else if(menu=='V'){
                    cout<<"Saving file..."<<endl;
                    collection.close();
                    cout<<"File saved."<<endl;
                    system("pause");
                }else{
                    system("pause");
                };
            }while(menu!='X');
            break;
        }
    }while(choice!=4);

    }


Что я уже пробовал:

Я пытался это сделать

коллекции.открыть(именем, с std::fstream::в | с std::fstream::нет | функция std::fstream::приложения);
collection<<ctr<<"\t"<<student[ctr].studentID<<"\t"<<student[ctr].surname<<"\t"<<student[ctr].firstname<<"\t"<<student[ctr].birthdate<<"\t"<<student[ctr].sex<<endl;
коллекции.рядом();

но я продолжаю получать эту ошибку

1 Ответов

Рейтинг:
10

Jochen Arndt

Вы пытаетесь записать во входной поток с помощью << operator которого нет (базовый класс istream не имеет этого оператора):

ifstream collection(filename, std::fstream::in | std::fstream::out | std::fstream::app);
// ...
collection.close();
// ...
collection.open(filename, std::fstream::in | std::fstream::out | std::fstream::app);
// Output operator << not present with istream based classes
collection<<ctr; // ...

Для выполнения ввода и вывода с одним потоком используйте fstream класс. Но в вашем случае, возможно, было бы лучше использовать новый объект выходного потока для записи.


mariaclara

Спасибо!