0

Пишу код, который должен вывести определенную строку из файла (text.txt), но возникает ошибка "file: переопределение; множественная инициализация" и ">>: недопустимо для class".

Код:

    struct element {
        char name[str_sz];
        int num, temperature;
        float viscosity;
    };
int main(){
element temp;
cout << "Введите номер строки которую хотите получить: ";
            int size, sz=0;
            string s;
            cin >> size;
            ifstream file("text.txt");
            while (!file.eof()) {
                getline(file, s);
                sz++;
            }
            file.close();
            while (size > sz) {
                cout << "Введенный номер больше чем строк в файле. Строк в файле: " << sz << endl << "Повторите ввод: ";
                cin >> size;
            }
            ifstream file("text.txt"); // тут ошибка
            if (!file.is_open())
                cout << "Не удалось открыть файл text.txt" << endl;
            for (int i = 0; i < size - 1; ++i)
                getline(file, s);
            file >> temp.name >> temp.num >> temp.temperature >> temp.viscosity; // тут ошибка
            file.close();
            cout << temp.name << " " << temp.num << " " << temp.temperature << " " << temp.viscosity << endl;
}
Kromster
  • 13,809
  • 2
    В одной области нельзя объявлять две переменные с одним именем. Или делаете вторую переменную file с другим именем file2. Или не вызывайте конструктор второй раз , а запускайте функцию open. – AlexGlebe Jan 31 '21 at 16:55
  • 2
    while (!file.eof()) { - тяжелый вздох, ссылка на то, почему так нельзя - https://ru.stackoverflow.com/q/833980/195342 Когда исправите - поместите текст от первого ifstream file("text.txt"); до первого же file.close(); в фигурные скобки, и ваша проблема уйдет сама собой :) – Harry Jan 31 '21 at 16:58
  • 1
    @AlexGlebe Или просто перемотайте файл на начало вместо закрытия-открытия, нет? – Harry Jan 31 '21 at 17:01
  • Только начинаю работать с файлами, так что ещё очень мало опыта. Спасибо за информацию, почитаю, прислушаюсь – Densv03 Jan 31 '21 at 17:02

2 Answers2

1

У вас два раза в одной области видимости объявлена переменная file.

Варианты решения. 1. Переименовать одну из переменных - скажем, file и file1.

Вариант 2 - поместить переменную в блок {} - тогда области видимости благополучно разрешатся.

cin >> size;
{
    ifstream file("text.txt");
    while (!file.eof()) {
        getline(file, s);
        sz++;
    }
}
while (size > sz) {

Вариант 3 - самый умный - не закрывать-открывать файл, а "перемотать" его в начало с помощью file.seekg(0) и работать дальше.

ifstream file("text.txt");
while (!file.eof()) {
    getline(file, s);
    sz++;
}
while (size > sz) {
    cout << ......;
    cin >> size;
}
file.seekg(0);
for (int i = 0; i < size - 1; ++i)

И исправьте это while (!file.eof()) {, а то просто глаза болят смотреть...

Harry
  • 221,325
0

В одной области нельзя объявлять две переменные с одним именем. Или делаете вторую переменную file с другим именем file2. Или не вызывайте конструктор второй раз , а запускайте функцию open.

Вторая ошибка : проверять конец файла нужно после попыток чтения.

        ifstream file("text.txt");
        while (true/*!file.eof()*/) {
            // ошибка вторая, проверку конца файла нужно делать после...
            getline(file, s);
            if(file.eof()){
                if(!s.empty())
                    sz++;
                break; }
            sz++;
        }
        file.close();
        ..
        //ifstream file("text.txt"); // тут ошибка
        file.open("text.txt");
        ..
        for (int i = 0; i < size - 1; ++i){
            getline(file, s);
            // всегда нужно проверять конец файла после...
            if(file.eof())
                break; }
AlexGlebe
  • 17,227