Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / удаление последнего символа из потока вывода / 7 сообщений из 7, страница 1 из 1
14.06.2013, 12:09
    #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
14.06.2013, 13:17
    #38297691
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление последнего символа из потока вывода
Compositum,
Есть куча способов как не писать туда пробел.
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
const char* separator = ""; // пустая строка
while(...)
{
    ofs << separator << value;
    separator = " "; // строка с пробелом
}
...
Рейтинг: 0 / 0
14.06.2013, 13:26
    #38297705
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
удаление последнего символа из потока вывода
Anatoly Moskovsky,

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

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

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

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


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