Запись в файл - PullRequest
       8

Запись в файл

0 голосов
/ 26 июня 2011

У меня очень простой вопрос относительно записи в файл.

У меня есть эта программа:

char buf[20];
size_t nbytes;

strcpy(buf, "All that glitters is not gold\n");
fd= open("test_file.txt",O_WRONLY);
write(fd,buf,strlen(buf));
close(fd);

Что смущает, когда я открываю файл test_file.txt после запуска этой программы Iсм. некоторые символы, такие как ^C^@^@^@^^^@ после строки «Все, что не блестит»: обратите внимание, что часть буфера не записана, и вместо них появляются эти символы.Почему это так?

Ответы [ 3 ]

6 голосов
/ 26 июня 2011

Вы пишете более 19 символов в этом буфере. Как только вы это сделаете, поведение вашей программы не определено. Он может делать все, что захочет.

Выделите достаточно большой буфер. Он должен быть в состоянии соответствовать всем буквам плюс завершающий 0, если вам нужно иметь возможность обрабатывать его как строку C.

5 голосов
/ 26 июня 2011

Строка "All that glitters is not gold\n" длиннее 20 символов. Я предлагаю вам попробовать это с большим буфером.

На самом деле, если вы собираетесь делать какую-то нетривиальную работу в C, я предлагаю вам никогда не использовать strcpy в качестве общей привычки. Используйте такие функции, как strncpy, которые позволяют указать размер буфера, чтобы было ясно, что вы никогда не переполнитесь.

2 голосов
/ 26 июня 2011

libgcc strcpy В руководстве написано:

Если строка назначения strcpy () недостаточно велика (то есть, если программист был глуп или ленив и не смог проверить размерперед копированием) тогда может случиться что угодно.Переполнение строк фиксированной длины является любимым методом взлома.

Также strlen говорит

Функция strlen () вычисляет длину строки s, не включаязавершающий символ '\ 0'.

Так что, я думаю, strlen () не возвращает того, что вы ожидаете, и в результате дополнительные символы пишутся

.Для работы необходимо выделить достаточно большой буфер, в котором может храниться вся строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...