Первая проблема, которую необходимо решить, заключается в том, что символ новой строки представлен обратной косой чертой-n ('\n'
или "\n"
), а не косой чертой-n.
Когда вы пишете '/n'
, вы должны получить предупреждение компилятора о многосимвольной символьной константе, которая является непереносимой частью C.
Очевидно, вы можете создать переменную для хранения новой строки, но в этом нет необходимости; Строковый литерал будет в порядке. Если вы это сделаете, правильное обозначение будет:
const char newline[] = "\n";
Вы можете написать:
const char rather_odd[3] = { '/n' };
но ... фигурные скобки необходимы, и первый символ имеет значение, зависящее от компилятора, а два других символа равны NUL '\0'
. Это также использует больше минимально необходимого пространства; переменная newline
представляет собой 2-байтовый массив.
С вашей нестандартной Write()
функцией, возможно, правильный синтаксис:
Write(logs, "\n", 1);
Это испускает одну новую строку; если предыдущая строка (та, что в log
) сама не была завершена символом новой строки, у вас нет пустой строки в файле; вам придется написать второй перевод строки. Возможно, вы даже захотите проверить это:
size_t len = strlen(log);
Write(logs, log, len);
len = (log[len-1] == '\n') ? 1 : 2;
Write(logs, "\n\n", len);
Также обратите внимание, что GCC предупредит вас о глобальной переменной с именем log
(потому что стандарт C оставляет за собой имя). Локальные переменные в порядке.
$ cat x.c
int x = '/n';
int log = 2;
$ gcc -c x.c
x.c:1:9: warning: multi-character character constant
x.c:2:5: warning: built-in function ‘log’ declared as non-function
$
Недавно я столкнулся с этой проблемой, когда воскрешал код, последний раз измененный около 20 лет назад.
(Тестирование с GCC 4.5.2 на MacOS X 10.6.6.)