Сейчас на форуме: tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› cout и символ конца строки - сложный вопрос
Посл.ответ Сообщение

Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 февраля 2008 03:19 · Поправил: smex
· Личное сообщение · #1

Доброго времени суток уважаемые форумчане. Страшнейшая сложность постигла меня, день просидел, ниче не придумал. Был готов скинуть комп с балкона, но удержался... Ладно, не буду воду лить, сразу вопрос:
ch=0xA;
cout<<ch;
На самом деле выведет 0x0D0A. То есть добавляет символ конца строки. Кто нибудь может подскажет как его не добавлять. Уже испробовал все - и с флагами игрался (setf, unsetf) и cout(ios::binary); делал, ничего не помогает. Может кто знает как решить эту сложнейшую задачу.

PS: Нужно это для того что бы с моей программой можно было нормально работать как через консоль, так и через файлы, используя перенапрапление ввода-вывода (< или >), так вот, из за этой лажы не могу сделать вывод файл 0A без 0D.

PS2: Понимаю что вопрос многим придется не по душе, а я задал сюда так как это единственны форум на котором я общаюсь. Если нет возможности помоч с проблемой, по возможности пошлите на нормальный форум по программингу.



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 15 февраля 2008 10:32
· Личное сообщение · #2

"\n" тоже дает 0d 0a ?



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 15 февраля 2008 13:28 · Поправил: HiEndsoft
· Личное сообщение · #3

Смотри реализацию cout в CRT в VC и добавляй '\0' в конце строки. А потом забей на crt и юзай WriteConsole...

-----
продавец резиновых утёнков




Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 февраля 2008 13:45
· Личное сообщение · #4

Ох ты точно, надо побаловаться с API. Хотя изврат это, кроссплатформенность теряется.

TO ssx: Да, тока что проверил - тоже самое.

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

PS: Понимю, что вопрос совсем не по тематике сайта, поэтому прошу прощения если кто посчитал его за флуд. Просто среди ночи не выдержал извражаться с этим cout и вылил все что я о нем думаю сюда...



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 15 февраля 2008 14:46 · Поправил: cppasm
· Личное сообщение · #5

А если не секрет почему такая острая потребность вывести именно \n а не \r\n??
Т.е. что выводится - логи какие-то или что?



Ранг: 17.8 (новичок)
Активность: 0.020
Статус: Участник

Создано: 15 февраля 2008 15:13 · Поправил: UR-Shark
· Личное сообщение · #6

А не сходить бы вам в MSDN?
Окрывать нужно в двоичном режиме. Если юзаешь fopen то делай так:
fopen("a.txt","wb");



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 15 февраля 2008 15:23 · Поправил: HiEndsoft
· Личное сообщение · #7

smex пишет:кроссплатформенность теряется а ch=0xA; вместо ch='\n' не теряется? С каких это пор API стал по сравнению с CRT извратом?

-----
продавец резиновых утёнков




Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 февраля 2008 20:18
· Личное сообщение · #8

cppasm: Да именно, программа выводит результаты своей работы. И одно из условий перенапраление потока вывода куда угодно.

UR-Shark: Да ты прав, я этот способ давно прошарил и пока он работает как заглушка. У него есть минус - привязка к конкретному файлу.

HiEndsoft: cout ведь есть и в линуксе, однако API в линуксе совсем другие... Может и не изврат, но потеря кроссплтформенности.

PS: А может так невозможно сделать. Может перенаправление cout и cin, способны работать только в текстовом режиме. Наверное так оно и есть. Разочаровался я очень в ООП, а такая получилась бы отличная, понятная программа...




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 16 февраля 2008 01:25
· Личное сообщение · #9

smex, AFAIK перекодировка в "\r\n" сидит во всех стпндартных классах работы со строками и потоками (streams) для доса и винды. Ведь unix-овый файл Notepad не читает Так енто, я бы, вместо того что б биться рогами в наследие dos, просто написал бы мелкий перекодировщик для файлов.

Кста, ты запутаешь windows проги если в поток будешь гнать строки с "\n"




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 16 февраля 2008 12:31
· Личное сообщение · #10

unsigned int ch=0xA;
cout<<ch;

и все работает

>PS: А может так невозможно сделать. Может перенаправление cout и cin, способны работать только в >текстовом режиме. Наверное так оно и есть. Разочаровался я очень в ООП, а такая получилась бы >отличная, понятная программа...

как в нем можно разочароваться когда вы его и не знаете



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 16 февраля 2008 23:57
· Личное сообщение · #11

reversecode пишет:
unsigned int ch=0xA;
cout<<ch;

Для тех кто в танке - это не работает. Точнее не так как хочет автор.
Напиши такой код а потом запусти свою прогу test.exe > log.txt и посмотри что в txt будет записано 2 байта - вместо 0Ah который ты выводиш будет 0Dh 0Ah

UR-Shark пишет:
А не сходить бы вам в MSDN?
Окрывать нужно в двоичном режиме. Если юзаешь fopen то делай так:
fopen("a.txt","wb");

Это не новость, но подходит только для файлов. Для консоли это не работает.

smex пишет:
cppasm: Да именно, программа выводит результаты своей работы. И одно из условий перенапраление потока вывода куда угодно.

Тогда не понятно такое острое желание получить именно \n в файле вместо \r\n
На Win32 платформе это будет расценено как один перевод строки, а если под nix запустить программу с перенаправлением вывода, то там не будет такого преобразования.
Т.е. в файле будет один байт 0Ah
Проблемы возможны только если лог создавать под Win, а читать под Nix, и наоборот.
Но такие проблемы в принципе существуют для всех текстовых файлов - потому что под Win перевод строки это '\r\n', а под Nix просто '\n'
Можно написать недольшой конвертер, да и готовые есть...




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 17 февраля 2008 01:58
· Личное сообщение · #12

все я понял
может у меня танк не такой, пусть каждый попробует у себя сам

unsigned char d = 0xa;

cout << binary << d << flush;

PS unix.... windows ... какая им разница, ООП лишь обертка над printf



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 17 февраля 2008 11:16 · Поправил: cppasm
· Личное сообщение · #13

reversecode пишет:
может у меня танк не такой, пусть каждый попробует у себя сам

Может и не такой
Но это
reversecode пишет:
unsigned int ch=0xA;
cout<<ch;

и это
reversecode пишет:
nsigned char d = 0xa;
cout << binary << d << flush;

это немного разные вещи.
С бинари конечно работает.

Вопрос по сути был как для консоли поменять режим вывода на бинарный.
На Си работает так:

#include<io.h>
#include<fcntl.h>
#include<stdio.h>
void main(void)
{
setmode(fileno(stdout),O_BINARY);
printf("\n");
}

reversecode пишет:
PS unix.... windows ... какая им разница, ООП лишь обертка над printf

Разница есть.
Напиши:
#include<io.h>
#include<fcntl.h>
#include<stdio.h>
void main(void)
{
setmode(fileno(stdout),O_BINARY);
printf("Line1\nLine2\n");
}
И запусти test.exe >log.txt
А потом открой этот log.txt под Win и под Nix.
Под Nix всё будет нормально, а вот что под Win будет можеш посмотреть в блокноте.
А если писать "\r\n" - то ситуация будет обратная, в Win ok, а в Nix нет.



Ранг: 56.3 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 17 февраля 2008 19:25
· Личное сообщение · #14

Символ переноса строки является platform-specific константой, так что ни С++, ни тем более ООП тут не причём



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 20 февраля 2008 02:13
· Личное сообщение · #15

Сори парни. Я отлучился на пару дней. Но я просто в восторге от этого форума и контингента людей, находящихся здесь!! Меня не раз выручали, и вот снова блестящий ответ на мой вопрос. Большое человеческое спасибо - setmode(fileno(stdout),O_BINARY);. Это действительно работает.

PS: Вот только не получилось с минипулятором потока <<binary<<. Пишет неизвестный идентификатор. Подрубал все известные мне библы, почитал умную книжку - нигде о нем ничего не упоминается. Подскажите как у вас это запустилось.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 20 февраля 2008 12:23
· Личное сообщение · #16

все стандартно

Visual Stidio 6

#include <iostream.h>
#include <fstream.h>

.....
дальше по тексту




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 20 февраля 2008 20:13
· Личное сообщение · #17

smex, ios::binary - www.angelfire.com/country/aldev0/cpphowto/cpp_BinaryFileIO.html



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 21 февраля 2008 04:36
· Личное сообщение · #18

Всем большое спасибо. Разобрался.
Прикольно, хоть на принтер вывод перенаправляй. ))) Все таки удобная вещь это.



Ранг: 8.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 февраля 2008 21:32
· Личное сообщение · #19

Может кто подскажет как вывести на консоль именно симовлы 0x08 0x09 0x0A 0x0C 0x0D



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 29 февраля 2008 21:57
· Личное сообщение · #20

"симовлы" '\0x08' '\0x09' '\0x0A'...

-----
продавец резиновых утёнков




Ранг: 8.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 февраля 2008 22:05 · Поправил: -Garrett-
· Личное сообщение · #21

я имел ввиду в масиве среди прочих значений имеются и вышеперечисленные. Как получить их ansi "изображение". Не делать же проверку с каждым значением...
Да и почему-то не получилось '0x08'...



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 29 февраля 2008 23:10 · Поправил: HiEndsoft
· Личное сообщение · #22

Вообще-то '\0x08' - впереди слэш, во-вторых куда выводить-то? В консоль или контрол? Учебник Си рулит.

-----
продавец резиновых утёнков




Ранг: 8.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 29 февраля 2008 23:24 · Поправил: -Garrett-
· Личное сообщение · #23

Сорри описался. есно выводил со слешем. Вывод в консоль. Выводил cout'ом



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 02 марта 2008 13:24
· Личное сообщение · #24

cppasm пишет:
вместо 0Ah который ты выводиш будет 0Dh 0Ah

Думаю, ты просто опечатался. 0x30 0x41

smex пишет:
<<binary<<. Пишет неизвестный идентификатор

Так и должно быть. Автор похоже не запускал это код, даже если он и как-то умудрился собраться. Ибо вот, например, фрагмент реализации iostreams:

/// 27.4.2 Class ios_base [ios.base]
class ios_base
{
/// 27.4.2.1.4 Type ios_base::openmode [ios::openmode]
typedef uint8_t openmode;
static const openmode binary = 1 << 5;
...

Соответственно в вывод пойдет 32 (число зависит от реализации библиотеки)

А вот что такое манипуляторы:

///\name 27.4.5.1 fmtflags manipulators [fmtflags.manip]

inline
ios_base&
boolalpha(ios_base& str)
{
str.setf(ios_base::boolalpha);
return str;
}

Работает это довольно хитро - в классе basic_ostream есть специальные функции-члены; для данного случая:

basic_ostream<charT, traits>&
operator<<(ios_base& (*pf)(ios_base&))
{
pf(*this);
return *this;
}

-Garrett- пишет:
Как получить их ansi "изображение"

Изображением 0x07 является бип


 eXeL@B —› Программирование —› cout и символ конца строки - сложный вопрос
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати