Добавление текстового файла в массив символов, получение вывода мусора

63
6

Когда я добавляю файл в массив символов, затем печатаю, я получаю вывод мусора (случайные символы ASCII). Файл содержит только текст (абзац).

Код выглядит следующим образом:

int arraySize = 0;
string line;
while(getline(inFile, line)){
//cout << line << endl; // this will print array fine.
arraySize += line.length();
}
char message[arraySize];
char encrypted[arraySize];
//adds file to array
int i = 0;
while(inFile.good() && !inFile.eof()){
inFile.get(message[i]);
i++;
}
message[i] = '\0';
//prints array
for(int i = 0; i < arraySize; i++){
cout << message[i]; //this returns garbage values
}

Я считаю, что он печатает мусор, потому что он ничего не видит в сообщениях массива, но я не знаю, почему там "ничего нет".

спросил(а) 2021-01-19T20:03:04+03:00 6 месяцев назад
1
Решение
64

Причина в том, что вы достигли конца файла при подсчете длины текста, таким образом, указатель чтения находится в конце файла, и вы снова использовали его для чтения текстового файла.

Для этого: верните указатель чтения в начало:

inFile.clear();
inFile.seekg(0, ios::beg);
while(inFile.get(message[i])){
i++;
}

Также не используйте: while (!infile.eof()) считается неправильным.

    Я рекомендую использовать std::vector вы не возражаете против размера файла или распределения/распределения памяти. Таким образом, ваш код может выглядеть так:

    std::ifstream inFile("data.txt"); // your file name here
    std::string strLine;
    std::vector<std::string> vecStr;

    while(std::getline(inFile, strLine))
    vecStr.push_back(strLine);

    for(int i(0); i < vecStr.size(); i++)
    std::cout << vecStr[i] << std::endl;

    inFile.close();

Вы видели, как код прелести выше?

    NB: вы получили значения мусора, потому что массив объявлен, но не инициализирован:

Первое чтение получает длину текста. Но переместил указатель чтения до конца, а затем вы сделали:

while(inFile.good() && !inFile.eof()){ // Will fail because inFile.eof() is true from the previous read.
//std::cout << "Inside the reading loop" << std::endl;
inFile.get(message[i]);
i++;
}

Как вы можете видеть выше, цикл не будет выполняться, потому что предыдущее чтение достигло eof поэтому массив объявляется без инициализации, так как вы знаете, что он содержит значения мусора.

Чтобы подтвердить, что цикл не выполняется, выполните размытие строки выше и посмотрите, выполняется ли цикл. В результате не печатается сообщение, что означает, что он не был выполнен.

ответил(а) 2021-01-19T20:03:04+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема