Как использовать системный вызов «write», используя C langauge в Linux? - PullRequest
1 голос
/ 19 марта 2020

Мой код работает нормально. Единственная ошибка, которую я получаю, состоит в том, что после того, как программа записывает текст в файл, т.е. text1.txt, текстовый файл печатает некоторые странные символы, такие как / 00, когда я фактически открываю его.

int fd;
fd = open("text1.txt", O_RDWR);
char text[] = "This is my file.";
write(fd,text,sizeof(text));

1 Ответ

3 голосов
/ 19 марта 2020
  • Вы должны убедиться, что open успешно, вместо слепой записи в файл-дескриптор.
    • Всегда проверяйте возвращаемое значение системного вызова (и большинство C стандартных функций библиотеки) и проверяйте errno, если возвращаемое значение указывает на ошибку.
  • Ваш строковый литерал будет содержать скрытый символ \0 (NULL) после точки.
    • Запись text непосредственно в файл, следовательно, будет включать в себя конечный \0, который вы видите.

Эти проблемы могут быть устранены по:

  • Всегда проверяйте возвращаемое значение системного вызова - и в этом случае: выведите полезное сообщение об ошибке в стандартный вывод и выполните любую необходимую очистку (оператор goto closeFile;).

    • Поскольку C не имеет собственного try/catch или RAII, это означает, что трудно написать краткий код обработки ошибок и очистки, но с использованием goto для общего кода очистки обычно допустимо в C, поэтому оператор goto closeFile.
  • Использование strlen для получения фактической длины строки.

    • Хотя в крайнем случае можно использовать sizeof(text) - 1, если вы находитесь в области, где компилятор C знает длину text, так как использование sizeof() не будет работать, если вы пересечете функцию граница из-за затухания указателя массива .

Вот так:

void writeToFile() {

    int fd = open( "text1.txt", O_CREAT | O_WRONLY ); // Use `O_WRONLY` instead of `O_RDWR` if you're only writing to the file. Use `O_CREAT` to create a file if it doesn't already exist.
    if( fd == -1 ) {
        printf( "Error opening file: errno: %d - %s\n", errno, strerror( errno ) );
        return;
    }

    size_t textLength = strlen( text );
    size_t written = write( fd, text, textLength );
    if( written == -1 ) {
        printf( "Error writing text: errno: %d - %s\n", errno, strerror( errno ) );
        goto closeFile;
    }
    else if( written < textLength ) {
        printf( "Warning: Only %d of %d bytes were written.", written, textLength );
        goto closeFile;
    }
    else {
        // Carry on as normal.
    } 

closeFile:
    if( close( fd ) == -1 ) {
        printf( "Error closing file: errno: %d - %s\n", errno, strerror( errno ) );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...