Что может привести к возникновению этой ошибки при использовании массива?Решение? - PullRequest
0 голосов
/ 25 сентября 2018

немного новенький, пытался решить проблему с getline.То, что я нашел источник ошибки, было связано с intext [18].После удаления массива все ошибки исчезают.Проблема в том, что у меня есть 19 строк данных, которые мне нужно извлечь, поэтому вместо того, чтобы набирать каждую строку, я решил попытаться поместить все это в массив.Я очень плохо знаком с c ++, и это единственный раз, когда я попал в стену.Я заранее прошу прощения, если это было решено.Я искал весь день без решимости.

#include "pch.h"
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
#include <array>

using namespace std;

int main()
{
    ifstream inFile;
    string intext[18];

    inFile.open("HW3_Data_W.txt");
    while (inFile.is_open()) {
        getline(inFile, intext);

        cout << "Data from the file:" << endl; 
        cout << "Item 1: " << intext << endl;

        break;

        inFile.close();
    }
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вы пытаетесь присвоить строковое значение переменной строкового массива, вы должны getline(inFile, intext[i]);, где i - номер строки.

Также ваш массив может содержать только 18 строк текста, потому что выобъявил об этом так.Если вы хотите читать файлы, которые содержат ровно 19 строк, вы должны объявить это следующим образом:

string intext[19];

Если вы хотите, чтобы ваша программа читала любое количество строк, вы должны использовать std :: vector.

Кроме того, ваш цикл while будет повторяться только один раз.потому что вы нарушаете это безоговорочно.Я думаю, что вы хотели сделать что-то вроде этого:

inFile.open("HW3_Data_W.txt");
int i = 1;
while (inFile.is_open()) {
    getline(inFile, intext[i]);
    i = i + 1;
    cout << "Data from the file:" << endl; 
    cout << "Item 1: " << intext << endl;

    if(inFile.eof) continue;

    inFile.close();
}

Этот код должен работать, но излишне сложен.Ваше условие while проверяет, открыт ли ваш файл, но он будет открыт до тех пор, пока вы его не закроете, и вы захотите закрыть его, когда достигнете конца файла.Таким образом, ваше условие while выглядит следующим образом: while (getline (inFile, intext [i])) getline вернет значение, которое можно преобразовать в false, если оно достигнет последней строки вашего файла, поэтому ваше while будет идти до тех пор, пока вы не прочитаете while file.И вы должны проверить, если файл открыт до вашего времени, а затем вы должны закрыть файл через некоторое время.Вот как то так:

inFile.open("HW3_Data_W.txt");
int i = 0;

if(!inFile.is_open())
    return EXIT_FAILURE;

while(getline(inFile, intext[i])) {
    cout << "Item "<<i<<": " << intext[i] << endl;
}

inFile.close()
0 голосов
/ 25 сентября 2018

Некоторые проблемы здесь:

  1. Если у вас есть 19 строк для чтения, тогда размер массива строк должен быть не менее 19.

  2. Убедитесь, что файл успешно открыт только один раз.Нет необходимости проверять условие while.

  3. Считывать в последовательные элементы массива intext в while, используя счетчик, который инициализируется равным 0 перед циклом while.Увеличьте этот счетчик в цикле while.

  4. Удалите break из while, если хотите прочитать весь файл.

  5. Не закрывайте ifstream во время.Сделайте это после цикла while.

...