Дурачиться с * nix API приводит к искаженным текстовым файлам - PullRequest
0 голосов
/ 02 марта 2011
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

int main () {
        char grade[5];
        char name[30];

        int fd = creat("notas.txt", 0644);

        if (fd == -1) {
            perror("notas.txt");
            return 1;
        }


        while (1) {
            scanf("%s %s", name, grade);
            if (strcmp(name, "end") != 0) {
                write(fd, name, 30);
                write(fd, "\t", 1);
                write(fd, grade, 5);
                write(fd, "\n", 1);
            } else {
                close(fd);
                return 0;
            }
        }

}

Привет всем. Я пытаюсь войти в * nix Kernel API-программирование, и я написал вышеупомянутую программу. Он читает имена и оценки из командной строки, а затем записывает их в файл. Однако файл искажен, я могу только cat его (не открывается в текстовом редакторе), и мои данные появляются среди потока искаженных случайных символов. После cat в файле мое приглашение также содержит несколько случайных символов, таких как 1C2;1C3 (...).

Почему это происходит?

Спасибо всем.

1 Ответ

4 голосов
/ 02 марта 2011

write() записывает байты в файл, а не только в строки. Третий параметр write() - это количество байтов для записи. write(fd, name, 30), таким образом, записывает 30 байтов в файл, но строка в name короче, поэтому в файл записывается набор случайных символов, попадающих в память.

В C длина строки указывается путем помещения нулевого символа ('\0', который равен 0) в конце строки, и ее можно проверить с помощью функции strlen(), поэтому вам нужно написать write(fd, name, strlen(name)).

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