#c #system-calls #dot
#c #системные вызовы #точка
Вопрос:
Это моя маленькая программа на C:
int main(int ac, char **av)
{
int fd;
if ((fd = open("./test.dot", O_RDWR | O_CREAT | O_TRUNC, 0644)) == -1)
{
perror("[open]");
return (-1);
}
write(fd, "digraph g {n", sizeof("digraph g {n"));
write(fd, " a -> b -> cn", sizeof(" a -> b -> cn"));
write(fd, " b -> dn", sizeof(" b -> dn"));
write(fd, " }n", sizeof(" }n"));
close(fd);
}
Он открывает файл, записывает что-то и закрывает его.
Это почти работает. Почти. Вот что я получаю, когда проверяю содержимое моего файла:
digraph g {
^@ a -> b -> c
^@ b -> d
^@ }
^@
Кажется, что эти символы появляются после каждой новой строки. Что не так?
Ответ №1:
sizeof("digraph g {n")
включает нулевой ограничитель, поэтому строки записываются в файл с ''
символом.
Ваш просмотрщик файлов показывает нули, используя ^@
орграф.
Вы вообще не должны использовать sizeof
— вместо этого используйте strlen
. А еще лучше, используйте соответствующие функции ввода-вывода для записи строк в файлы, не требуя от вас указывать их длину в отдельном параметре. Если вам необходимо использовать write
, создайте свою собственную функцию, которая вызывает, strlen
за которой следует вызов write
, чтобы вы могли избежать двойного ввода строковых констант.
Ответ №2:
^@
Это представление вашего зрителя ''
.
Пример: sizeof(" }n")
Равно 4. ' '
, '}'
, 'n'
, ''
,
Ответ №3:
Я думаю, что вместо использования sizeof("string")
вам следует использовать strlen("string")
.