C системные вызовы open () - PullRequest
2 голосов
/ 07 ноября 2019

У меня проблемы с open(). Он всегда возвращает -1, и я не знаю, что не так с кодом. Он все время говорит:

r1: No such file or directory

, но txt-файл находится в том же каталоге, что и программа C.

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

#define BUFFSIZE 256

char upper(char c);

int main(void){

    int fd1, read1, fd2, write2;
    char *buffer[BUFFSIZE];

    fd1 = open("minuscole.txt", O_RDONLY);
    if (fd1 < 0) { perror("r1"); exit(1); }
    read1 = read(fd1, buffer, BUFFSIZE);
    close(fd1);

    printf("%d", read1);
    if(fd2 = open("maiuscole.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644) > 0){
        write2 = write(fd2, buffer, BUFFSIZE);
    }
    close(fd2);

    return 0;
}

Я ожидаю, что он создаст файл с именем: "maiuscole.txt" и напиши, что в: "minuscole.txt".

1 Ответ

5 голосов
/ 07 ноября 2019

Хотя вы говорите, что ваш входной файл совмещен с вашим исходным файлом, это не значит, что вы также запускаете исполняемый файл из того же места. Сообщение об ошибке ясно указывает, что вы не.

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

Как упоминалось в комментариях, ваш оператор присваивания для fd2 неверен, поскольку оператор присваивания имеет более низкий приоритет , чем оператор сравнения. Для согласованности предлагаю изменить код, чтобы он соответствовал стилю, используемому для fd1. Обратите внимание, что 0 также является допустимым файловым дескриптором.

fd2 = open("maiuscole.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if(fd2 >= 0){
    //...

Второй аргумент read и write принимает void * / const void * соответственно, поэтому он маскирует вашу ошибкугде вы передаете char *[] (который затухает до char **) для этих функций. Это не ваше намерение, поскольку char ** может хранить только sizeof(char *) байтов. Вы намереваетесь хранить до BUFFERSIZE байтов. Измените buffer на массив char вместо массива char *.

char buffer[BUFFSIZE];

После того, как вы прочитаете данные из входного файла, возвращаемое значение вызова read будетсколько байтов было прочитано. Вы должны записать только столько байтов в выходной файл, а не весь буфер.

    write2 = write(fd2, buffer, read1);

Если было прочитано только 10 байтов, то байты после первых 10 в буфере неинициализированы, и вы должныне записывайте их в свой вывод.

Существуют другие случаи и проверка ошибок, которые вы должны рассмотреть. Я не буду предоставлять все решения, но вы должны учитывать, что:

  • Ваш входной файл может быть больше, чем BUFFSIZE.
  • Вызов read может вернуть меньшечем BUFFSIZE, даже если файл больше BUFFSIZE.
  • Вызов write может вернуть менее read1.

Наконец, примечание о close. Вы не одиноки в игнорировании возвращаемого значения close, это очень распространенная вещь даже в рабочем коде. Тем не менее, по-прежнему рекомендуется проверять, успешно ли close. При определенных условиях он может потерпеть неудачу, потому что дескриптор уже был закрыт ранее. Возможно, вам будет интересно узнать, происходит ли это, поскольку это указывает на какую-то логическую ошибку в программе. Хотя закрытие неверного файлового дескриптора является доброкачественным, в будущем вы можете случайно закрыть файловый дескриптор, который сейчас используется какой-либо другой частью программы.

...