Использование read() для чтения файла на C

#c

Вопрос:

Моя цель-прочитать содержимое файла и распечатать его на экране

Итак, у меня есть файл под названием «file.txt». Я хочу прочитать его с помощью функции read (), а затем распечатать его содержимое.

Вот код, который я написал до сих пор:

 
int file = open("./file.txt",O_CREAT | O_WRONLY,0777); // added

char buffer[50];
printf("Reading file.txtn");
int bytes = read(file,buffer,sizeof(buffer));
printf("Bytes read = %dn",bytes);
if(bytes <=0 ){
  printf("file.txtn impossible to readn");   
}else{
  printf("Read - %s n",buffer);
}

close(file);
 

Мой код не работает. Он возвращает байт = -1.

Что не так с моим кодом?

В моем файле написано только одно предложение или один символ. Это так просто только для тестирования.

Комментарии:

1. Опубликованный код содержит синтаксические ошибки и не будет компилироваться. Пожалуйста, скопируйте и вставьте свой фактический код. В частности, это не приведет к компиляции: read(file.txt,buffer,sizeof(buffer)) Вы также должны использовать fread , а не read , и, конечно fopen , и fclose .

2. Любая книга, учебник или пример, с которыми вы сталкиваетесь, должны были сказать вам, что сначала вам нужно открыть файл. Похоже, вы только read что откуда-то что-то слышали, но не удосужились узнать об этом больше, а просто гадаете о вещах и о том, как это работает. Это никогда не лучший способ чему — либо научиться. Учись, и учись усердно.

3. @GratefullyDead «фрагмент здесь, который действительно имеет значение» Нет. Если вы не понимаете, что происходит, а вы, очевидно, этого не понимаете, то вы не знаете, что действительно имеет значение. Иногда очень важны конкретные используемые файлы заголовков. Объявления переменных чрезвычайно важны. Например, фрагмент кода, используемый file.txt в вызове чтения, который, как мы все ЗНАЕМ , полностью ошибочен.

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

5. Когда вы опускаете O_WRONLY (что равно 1), у вас остается 0 (что равно O_RDONLY ). Вот почему это работает

Ответ №1:

Вы хотите открыть файл, если он не существует, вы также хотите записать в него, я полагаю, поэтому вам нужно открыть его как с правами на чтение, так и на запись

Вот пример использования цикла, когда мы не знаем, насколько велик файл (поэтому мы не читаем здесь за один раз).

 #include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int fd = open("file.txt", O_RDWR | O_CREAT, 0777);
    if (fd == -1) {
        perror("open");
        exit(1);
    }

    char buf[BUFSIZ 1];
    ssize_t n = 0;
    while ((n = read(fd, buf, BUFSIZ)) > 0) {
        buf[n] = '';
        if ((write(STDOUT_FILENO, buf, n)) == -1) {
            perror("write");
            exit(1);        
        }        
    }
    if (n == -1) {
        perror("read");
        exit(1);
    }

    if (close(fd) == -1) {
        perror("close");
        exit(1);    
    }
    exit(0);
}
 

И вот пример того, как сначала проверить, насколько велик файл, а затем прочитать все за один раз

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

int main(void) {
    int fd = open("file.txt", O_RDWR | O_CREAT, 0777);
    if (fd == -1) {
        perror("open");
        exit(1); 
    }

    struct stat sb;
    if (stat("file.txt", amp;sb) == -1) {
        perror("stat");
        exit(1);
    }

    // Incase you want to write to file if file is empty
    if (sb.st_size == 0) {
        puts("File is empty we can write to file here");
        // Write here
    } else {
        char *buf = malloc(sb.st_size 1);
        if (buf == NULL) {
            perror("malloc");
            exit(1);
        }
        if ((read(fd, buf, sb.st_size)) == -1) {
            perror("read");
            exit(1);
        }
        buf[sb.st_size] = '';
        if ((write(STDOUT_FILENO, buf, sb.st_size)) == -1) {
            perror("write");
            exit(1);
        }
    }

    if (close(fd) == -1) {
        perror("close");
    }
    exit(0);
}