Member 13479017 Ответов: 1

Программа будет отображать одну часть вывода, но отсутствует вторая часть.


Моя программа должна отображать содержимое введенного пользователем файла, что она и делает. Проблема в том, что он не отображает вторую часть, где он заменяет "пробел" словом, введенным пользователем. Он даже не предлагает пользователю ввести новое слово. Если кто-нибудь может помочь, спасибо.
Вот мой код:
/*        Program:	prog5B.cpp
	By:		Mackenzie Ritter
	Last Modified:	Nov 23, 2017
	Purpose:	To produce a filled out madlibs with users help.
	Notes:
*/
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>

using namespace std ;

string openInfile (ifstream&) ;
void openOutfile (ofstream&) ;
void change (string&, string&, string) ;

int main ()
{
	string line = " " ;
	string word = " " ;
	string diffLine = " " ;
	ifstream ins ;		//ins is an input stream
	ofstream outs ;		// outs is an output stream
	line = openInfile (ins) ;
	istringstream iss (line) ;
	while (getline(ins, line))
	{
		while (iss >> word)
		{
			change (word, diffLine, line) ;
		}
	cout << line << endl ;
	cout << diffLine << endl ;
	}
	ins.close () ;
	outs.close () ;
	cin.ignore () ;
	return 0 ;
}

/*	Function:	openInfile
	Last Modified:	Nov 23, 2017
	Purpose:	Opens the input file after getting file name from user.
	In Parameters:	None
	Out Parameters:	string fileName
	Return Value:	None
*/

string openInfile (ifstream& ins)
{
	string fileName = " " ;
	string line = " " ;
	ofstream outs ;		// outs is an output stream
	cout << "Enter file of madlibs outline." << endl ;
	cin >> fileName ;
	ins.open(fileName.c_str()) ;		//connects ins to file inFile
	if (ins.fail())
	{
		cerr << "Error: Unable to open file : " << fileName << endl ;
	}
	else
	{
		openOutfile (outs) ;
	}
return line ;
}

/*	Function:	openOutfile
	Last Modified:	Nov 23, 2017
	Purpose:	Opens the output file after getting file name from user.
	In Parameters:	None
	Out Parameters:	string copyFile
	Return Value:	None
*/

void openOutfile (ofstream& outs)
{
	string copyFile = " " ;
	cout << "Enter name of file for updated data." << endl ;
	cin >> copyFile ;
	outs.open(copyFile.c_str()) ;
}

/*	Function:		change
	Last Modified:	Nov 23, 2017
	Purpose:		Replaces blanks with words from user.
	In Parameters:	string word, diffLine
	Out Parameters:	string fileName
	Return Value:	None
*/

void change (string&word, string&diffLine, string line)
{
	string searchN = "blank-N" ;
	string searchA = "blank-A" ;
	string searchV = "blank-V" ;
	string searchP = "blank-P" ;
	string searchD = "blank-D" ;
	string noun, adjective, verb, place, adverb ;
	if (word == searchN)
	{
		cout << "Enter a noun." << endl ;
		cin >> noun ;
		diffLine = diffLine + noun + " " ;
	}
	else if (word == searchA)
	{
		cout << "Enter an adjective." << endl ;
		cin >> adjective ;
		diffLine = diffLine + noun + " " ;
	}
	else if (word == searchV)
	{
		cout << "Enter a verb." << endl ;
		cin >> verb ;
		diffLine = diffLine + noun + " " ;
	}
	else if (word == searchP)
	{
		cout << "Enter a place." << endl ;
		cin >> place ;
		diffLine = diffLine + noun + " " ;
	}
	else if (word == searchD)
	{
		cout << "Enter an adverb." << endl ;
		cin >> adverb ;
		diffLine = diffLine + noun + " " ;
	}
	else 
	{
		diffLine = diffLine + word + ' ' ;
	}
}


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

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

cvogt61457

Пора познакомиться с вашим самым полезным инструментом-отладчиком.
Это твой друг.
Научитесь им пользоваться.
С помощью отладчика вы сможете шагать по программе и видеть, что происходит во время выполнения.

Есть ли какие-либо ошибки компиляции или предупреждения, которые вы игнорируете?

Ну, просто быстро взглянув, вы объявили 2 переменные под названием "outs" - одну в main и одну в openInfile.
openInfile вызывает openOutfile.
Однако переменная outs в main должна использоваться для записи файла, но она никогда не устанавливается/инициализируется/используется.

Какая часть отображается? Какая часть не отображается?

Richard MacCutchan

Ваш призыв к openInfile возвращает пустую строку. И он не запрашивает у пользователя слово, так как ключ, который вы отправляете в функцию изменения, является пустым. Структура вашей программы выглядит не очень логично, и ее довольно трудно понять.

Member 13479017

Файл in отображается, но некоторые слова должны быть изменены и скопированы в файл out. Этого не происходит, и после исходных строк ничего не отображается.

1 Ответов

Рейтинг:
2

Jochen Arndt

Подумайте о том, что вы здесь делаете:

line = openInfile (ins) ;
istringstream iss (line) ;
Ваш openInfile() функции возвращают строку "" (один пробел), которая передается в istringstream::ссылка на istringstream - C++ [^] конструктор:
Цитата:
(2) конструктор инициализации
Создает объект istringstream с копией str в качестве содержимого.
Так что ваш iss поток содержит только одну строку пробела. Это извлекается позже с помощью >> оператор, оставляющий пустой объект потока.