· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› 13,10 или просто 10, т.е. \r\n или просто \n ?

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июн 29, 2004 16:02:08

Сабж вобщем-то.
Когда вместе с символом \n нужно использовать
символ \r (возврат-каретки)?
Например при консольном выводе строка должна
оканчиваться на 13,10 или достаточно просто 10 ?


Дата: Июн 29, 2004 18:12:58

Везде по разному. В консоли достаточно только \n, в текстовых файлах под dos и винду - \r\n, под linux - тоже только \n.


Дата: Июн 29, 2004 19:04:55

В маках(скорее всего до Mac OS X) - только \r.
Под unix/unix-like - хватает \n.
А вообще это уже было(поиск по CR&LF)


Дата: Июн 29, 2004 19:43:33

В MessageBox достаточно 13.


Дата: Июн 29, 2004 20:49:29

Запутали %)

Quantum
13 - это \r ? ну и как же оно прыгнет на новую строку?


Дата: Июн 29, 2004 21:16:34 · Поправил: Shift

Это в сях "\r".А на асме это походу 13(в десятичной системе).Парсер смотрит байтики и если это например 13,10 - делает переход на новую строку.


Дата: Июн 29, 2004 21:25:01

Shift

Нет, \n это 0Ah оно же 10
если не так то я вообще ниччё не понимаю ;-)


Дата: Июн 29, 2004 21:26:23

Ага, поправил ;-)

А если это просто 10 что? не делает? ;-)


Дата: Июн 29, 2004 21:41:30

Asterix
Тоже


Дата: Июн 30, 2004 06:49:34 · Поправил: q_q

Asterix
Использование \n или \n\r в Си/Си++ имеет отношение к translation mode, который является атрибутом _текстового_ файла/потока и влияет на функции ввода-вывода.

Если поток открыт как бинарный, то программа отвечает за все байты, в противном случае библиотека ввода-вывода осуществляет дополнительный анализ, например, символ с кодом 26 (1Ah) явняется признаком конца файла, даже если за ним есть что-либо и реальный размер файла больше. В случае newline character, библиотека ввода-вывода под dos будет преобразовывать его в пару 0d+0a, под unix - 0a, под mac - 0d.

при консольном выводе
Через функции printf, fprintf(stdout/stderr... и WriteFile(GetStdHandle(STD_OUTPUT_HANDLE) ... достаточно /n. Под asm'ом это эквивалентно 0a.


Дата: Июн 30, 2004 08:57:51

q_q
/n. Под asm'ом это эквивалентно 0a.
Не думаю. 0а - это переход на новую строку _без_ возврата каретки, => при выводе на консоль курсор лишь смещается вниз на одну позицию. (У меня в Виндовс это так.)


Дата: Июн 30, 2004 10:14:05

Anonimka
Не думаю.
Ты не думай, а проверяй на практике.

У меня в Виндовс это так.
Огласи методику эксперимента.

У меня работает такой код
.386
.model flat, stdcall
option casemap :none
.nolist
include windows.inc
include kernel32.inc
.list
includelib kernel32.lib

.data
  szTestWriteConsoleA db 'WriteConsoleA 1', 0ah
                      db 'WriteConsoleA 2', 0ah
                      db 0
  even
  szTestWriteFile     db 'WriteFile 1', 0ah
                      db 'WriteFile 2', 0ah
                      db 0
  even
  szTestPrintf        db 'printf 1', 0ah
                      db 'printf 2', 0ah
                      db 0
  even
  szMsvcrt            db 'msvcrt',0
  even
  szPrintf            db 'printf',0

.code
  even
  TestWriteConsoleA proc
    push eax            ; room for lpNumberOfCharsWritten
    push 0              ; lpReserved
    lea  eax,[esp+4]
    push eax            ; lpNumberOfCharsWritten
    push [esp+10h]
    call lstrlen
    push eax            ; nNumberOfCharsToWrite
    push [esp+14h]      ; pBuffer
    push STD_OUTPUT_HANDLE
    call GetStdHandle
    push eax            ; hConsoleOutput
    call WriteConsoleA
    pop  eax            ; free room
    retn 4
  TestWriteConsoleA endp

  even
  TestWriteFile proc
    push eax            ; room for lpNumberOfCharsWritten
    push 0              ; lpReserved
    lea  eax,[esp+4]
    push eax            ; lpNumberOfCharsWritten
    push [esp+10h]
    call lstrlen
    push eax            ; nNumberOfCharsToWrite
    push [esp+14h]      ; pBuffer
    push STD_OUTPUT_HANDLE
    call GetStdHandle
    push eax            ; hConsoleOutput
    call WriteFile
    pop  eax            ; free room
    retn 4
  TestWriteFile endp


  even
  TestPrintf proc
    push offset szMsvcrt
    call LoadLibrary
    test eax,eax
    jz short @@2
    push eax            ; for call FreeLibrary
    push offset szPrintf
    push eax
    call GetProcAddress
    test eax,eax
    jz short @@1
    mov  ecx,[esp+8]
    push ecx
    call eax
    pop  ecx
  @@1:
    call FreeLibrary
  @@2:
    retn 4
  TestPrintf endp

  
  main proc

    push offset szTestWriteConsoleA
    call TestWriteConsoleA

    push offset szTestWriteFile
    call TestWriteFile

    push offset szTestPrintf
    call TestPrintf
  
    push 0
    call ExitProcess
  main endp
end main


Дата: Июн 30, 2004 10:31:51

q_q
А ты попробуй сначала type file.txt (с соответствующим содержимым), а потом уже и пену у рта пузыряй.


Дата: Июн 30, 2004 10:38:20

q_q
Кстати, вопрос был достаточно общим, чтобы ограничиваться win api. А твоя эта WriteConsole, между прочим, работает как WriteFile, то есть, пишет как в файл, а не как на консоль, что есть-таки две большие разницы.


Дата: Июн 30, 2004 11:07:27

Anonimka
попробуй сначала type file.txt
Попробовал w2ksp4. Содержимое 31 0A 31 0A 31 0A. В результате три единицы в разных строках.

пишет как в файл, а не как на консоль, что есть-таки две большие разницы
Я сразу писал, что \n и \r имеют отношение к текстовым файлам/потокам. На консоль, по-твоему - это в видеопамять как под dos 0B800h?

вопрос был достаточно общим, чтобы ограничиваться win api
msvcrt.printf - это winapi?

а потом уже и пену у рта пузыряй
Не лезь в бутылку (вдруг ты не прав), а приводи аргументы.
Дай свое определение консоли и еще раз прошу огласи свои условия эксперимента в котором 0Ah не переводит курсор на новую строку.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.062