Это часть большого кода для дословного чтения входного файла, а затем печати слов в обратном порядке. Он использует строковый массив words [] для хранения, пословных, строк символов из входного файла ранее в программе:
//print to screen
for (int i = MAXSIZE; i >= 0; i--)
{
cout << words[i] << " ";
}
Проверьте содержимое входного файла:
This is my test file. I hope this works.
Вывод просто «работает». Повторяется снова и снова.
Почему я … очевидно, никогда не происходит?
РЕДАКТИРОВАТЬ: все из моего кода. Я немного переживаю, если не сказать больше. MAXSIZE = 1024 части лабораторного приглашения. Не могу использовать векторы или наоборот; видел, что все кончено, но это запрещено для этой лаборатории. Новичок в программировании, так что если бы вы могли воздерживаться от снисходительности, это было бы здорово. Просто пытаюсь заставить это работать. Чтение input.txt и бит печати на экран работает нормально. Выходная часть — полный провал, и я не знаю почему. Может кто-то просто сказать мне, почему вместо того, чтобы оскорблять меня, спасибо?
//Kristen Korz
//CIS 22A
//This program reads an input file and writes the words in reverse order to an output file.
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
//create and link input...
ifstream inputFile;
inputFile.open("input.txt");
//...and output files
ofstream outputFile;
outputFile.open("output.txt");
//error message for file open fail
if (inputFile.fail())
cout << "Error opening the file.\n";
//constant for max size
const int MAXSIZE = 1024;
//string array and temporary-use string
string words[MAXSIZE];
string str; //note: variables will be used for output loops too
//read words from input file
for (int i = 0; (inputFile >> str) && (i < MAXSIZE); ++i)
{
words[i] = str;
//for showing in terminal if read correctly
cout << words[i] << " ";
}
inputFile.close();
cout << endl;
//something wrong with for loop resulting in i apparently not updating
for (int i = MAXSIZE; (outputFile << str) && (i >= 0); --i)
{
words[i] = str;
//for showing in terminal if written correctly
cout << words[i] << " ";
}
outputFile.close();
cout << endl;
system("pause");
return 0;
}
Для вывода, который я также напечатал, мои операторы cout в циклах for говорят:
cout << words[i] << " " << i << " ";
Предоставление терминальной продукции:
Это 0 1 мой 2 тест 3 файла. 4 я 5 надеюсь 6 это 7 работ. 8
работает. 1023 работы. 1022 работы. 1021 (много повторений произведений. С последующим уменьшением чисел). 3 работы. 2 работы. 1 работает. 0
Ваш выходной цикл делает:
words[i] = str;
за каждую итерацию. str
по-прежнему содержит значение последней введенной вами строки, так что это устанавливает каждый член words
быть одной и той же строкой. Так как ваша последняя входная строка была "works"
это объясняет, почему вы выводите "works"
каждый раз.
Это должно работать лучше, если вы просто удалите эту строку. Кроме того, начните с MAXSIZE - 1
, Действительными индексами массива являются 0
через MAXSIZE-1
, Ваш доступ за пределами допустимого диапазона вызывает неопределенное поведение, хотя, по-видимому, в этом случае это не имело никакого эффекта.
Однако если ваш ввод содержит только 8 слов, как вы предлагаете, то вывод 1024 слов даст вам много пустого пространства. Рассмотрим начало вывода откуда i
встал, вместо MAXSIZE - 1
,
На части помечены как не работающие (вторая for
петля), str
читается из, но он никогда не изменяется на что-либо еще в этом цикле, поэтому он повторяет последнее слово. i
обновляется, проблема в том, что str
не обновляется.
Другая проблема заключается в том, что вы пытаетесь получить доступ к элементу за концом массива, как обсуждали в своих ответах WhozCraig и Velthune. Вы должны правильно понять, что вы хотите сделать с words
во второй for
петля. Это ключ. Кроме того, вам нужно хранить, где заканчивается массив, который вы читаете.
Просмотр ссылки на WhozCraig, если у вас есть:
const int MAXSIZE = 1024;
string words[MAXSIZE];
for (int i = MAXSIZE; i >= 0; i--) {
cout << words[i] << " ";
}
У вас есть строка, которая с 0..1023.
Доступ к словам [1024] потенциально опасен.
Для правильной итерации вашей строки выполните:
for (int i = MAXSIZE - 1; i >= 0; --i) {
cout << words[i] << " ";
}
Кстати, когда вы заполняете слова, добавьте элемент управления:
for (int i = 0; (inputFile >> str) && (i < MAXSIZE); ++i)) {
if(str.size() <= MAXSIZE) {
words[i] = str;
}
}
Убедитесь, что ваша строка в файле:
"This is my test file. I hope this works. "
не заканчивается пробелом. Чтобы быть уверенным, проверьте добавление «EOF» к вашей строке:
"This is my test file. I hope this works.EOF"
Другой, сделайте ваш цикл следующим образом:
int i = 0;
while(inputFile.good() && i < MAXSIZE) {
std::string word << inputFile;
if(!word.empty())
words[i] = str;
//for showing in terminal if read correctly
cout << words[i] << " ";
}
Проблема, почему вы получаете много «работ» здесь:
После этого кода:
//read words from input file
for (int i = 0; (inputFile >> str) && (i < MAXSIZE); ++i)
{
words[i] = str;
//for showing in terminal if read correctly
cout << words[i] << " ";
}
inputFile.close();
cout << endl;
//str = "works";
Значения переменных str
является works
,
После этого вы устанавливаете все элементы в words
от str
, Так что все элементы в words
сейчас одинаковое значение works
,
for (int i = MAXSIZE; (outputFile << str) && (i >= 0); --i)
{
words[i] = str;//=="works"//for showing in terminal if written correctly
cout << words[i] << " ";
}
outputFile.close();
cout << endl;