powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / удаление последнего символа из потока вывода
7 сообщений из 7, страница 1 из 1
удаление последнего символа из потока вывода
    #38297615
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

Задание по книжке: требуется написать два приложения, первое из которых читает текстовый файл с целыми числами, разделёнными пробелом и создаёт двоичный файл, содержащий эти числа. Второе приложение должно выполнять обратное действие: на основе двоичного файла воссоздать текстовый.

Проблема заключается в том, что когда я воссоздаю текстовый файл, то у него всегда последним символом получается пробел (т.е. лишний символ).

Можно ли как-то вытащить последний символ из потока вывода? Т.е. нужно нечто подобное тому, как unget() для потока ввода.
source.txt
10 20 30 40 50 100 15

txt 2 bin
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
/*
app1.cpp
© Andrey Bushman, 14 jun 2013.
Chapter 11, exercise 8.
*/
//--------------------------------------------------------------------------------------------------
#include "../../std_lib_facilities.h"
/* указанный файл заголовка можно скачать по адресу: http://www.stroustrup.com/Programming/std_lib_facilities.h
для его использования не требуется дополнительных файлов.
*/
//==================================================================================================
int main()
// entry point
try{
	cout << "(c) Andrey Bushman, 14 jun 2013." << endl << "Text to binary..." << endl;
	
	cout << "Source file: ";
	string sfname;
	getline(cin,sfname);
	if(!cin) error("Invalid input.");
	
	ifstream ifs(sfname.c_str());
	if(!ifs) error("Can't open input file: ", sfname);
	
	cout << "Target file: ";
	string tfname;
	getline(cin,tfname);
	if(!cin) error("Invalid input.");
	
	ofstream ofs(tfname.c_str(),ios_base::binary);
	if(!ofs) error("Can't open output file: ", tfname);
	
	int x;
	while(ifs >> x) ofs.write(as_bytes(x), sizeof(int));
	
	if(!ifs.eof()) error("Input stream error.");
	if(!ofs) error("Output stream error.");
	
	cout << "Operation is complete successfully." << endl;
}
catch(exception& e){
	cerr << e.what() << endl;
	return 1;
}
catch(...){
	cerr << "Unknown exception." << endl;
	return 2;
}



bin 2 txt
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
/*
app2.cpp
© Andrey Bushman, 14 jun 2013.
Chapter 11, exercise 8.
*/
//--------------------------------------------------------------------------------------------------
#include "../../std_lib_facilities.h"
/* указанный файл заголовка можно скачать по адресу: http://www.stroustrup.com/Programming/std_lib_facilities.h
для его использования не требуется дополнительных файлов.
*/
//==================================================================================================
int main()
// entry point
try{
	cout << "(c) Andrey Bushman, 14 jun 2013." << endl << "Binary to text..." << endl;
	
	cout << "Source file: ";
	string sfname;
	getline(cin,sfname);
	if(!cin) error("Invalid input.");
	
	ifstream ifs(sfname.c_str(),ios_base::binary);
	if(!ifs) error("Can't open input file: ", sfname);
	
	cout << "Target file: ";
	string tfname;
	getline(cin,tfname);
	if(!cin) error("Invalid input.");
	
	ofstream ofs(tfname.c_str(),ios_base::binary);
	if(!ofs) error("Can't open output file: ", tfname);
	
	int x;
	while(ifs.read(as_bytes(x),sizeof(x))) ofs << x << ' '; // TODO: проблема
	
	if(!ifs.eof()) error("Input stream error.");
	if(!ofs) error("Output stream error.");
	
	cout << "Operation is complete successfully." << endl;
}
catch(exception& e){
	cerr << e.what() << endl;
	return 1;
}
catch(...){
	cerr << "Unknown exception." << endl;
	return 2;
}




Спасибо.
...
Рейтинг: 0 / 0
удаление последнего символа из потока вывода
    #38297691
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,
Есть куча способов как не писать туда пробел.
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
const char* separator = ""; // пустая строка
while(...)
{
    ofs << separator << value;
    separator = " "; // строка с пробелом
}
...
Рейтинг: 0 / 0
удаление последнего символа из потока вывода
    #38297705
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Спасибо. Да, я в курсе об этом способе. И всё же интересует, можно ли вернуть последний уже отправленный (так, для себя хочу знать)? :)
...
Рейтинг: 0 / 0
удаление последнего символа из потока вывода
    #38297720
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

Отправленный куда?
...
Рейтинг: 0 / 0
удаление последнего символа из потока вывода
    #38297723
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivОтправленный куда?
любой ostream.
...
Рейтинг: 0 / 0
удаление последнего символа из потока вывода
    #38297746
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumИ всё же интересует, можно ли вернуть последний уже отправленный в любой ostream.

Видимо,
std::streambuf::sputbackc
std::streambuf::sungetc
...
Рейтинг: 0 / 0
удаление последнего символа из потока вывода
    #38297776
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumAnatoly Moskovsky,

Спасибо. Да, я в курсе об этом способе. И всё же интересует, можно ли вернуть последний уже отправленный (так, для себя хочу знать)? :)
Нельзя.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / удаление последнего символа из потока вывода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]