#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);
}