Как я могу читать и писать из файлов, используя заголовки fcntl.h и unistd.h?

Я пытаюсь узнать, как использовать заголовочные файлы <fcntl.h> а также <unistd.h>, Я создал небольшой пример для проверки работы их процедур, но он не сработал, как ожидалось. Вот мой код:

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

int main() {
int in=open( "test.in", O_RDONLY, S_IREAD );
int *a=new int[ 10 ];
read( in, a, 10 );
int out=open( "test.out", O_WRONLY, S_IWRITE );
write( out, a, 10 );
close( in ); close( out );
return 0;
}

Входной файл был: 1 2 3 4 5 6 7 8 9 10

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

1

Решение

Разделяй и властвуй.

Часть для написания:

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

int main() {
int const a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int const out { open( "testnums.out",
O_WRONLY | O_CREAT, S_IWRITE | S_IREAD) };
if(out==-1) {
perror("Cannot open file");
return 1;
}
ssize_t const written { write( out, a, sizeof(a) ) };
if(written<0) {
perror("Write error");
}
close( out );

return 0;
}

Когда скомпилировано и выполнено:

$ g++ -std=c++0x -Wall -Wextra tout.cc
$ ./a.out

он записывает массив ‘a’:

$ hexdump testnums.out
0000000 0001 0000 0002 0000 0003 0000 0004 0000
0000010 0005 0000 0006 0000 0007 0000 0008 0000
0000020 0009 0000 000a 0000
0000028

Обратите внимание, что это не переносимо — у каждого компилятора / архитектуры здесь может быть свой вывод.

Вот часть, чтобы снова прочитать это и записать в stdout:

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

int main() {

int const in { open( "testnums.out", O_RDONLY ) };

if(in==-1) {
perror("Cannot open file");
return 1;
}

int a[10];
ssize_t const r { read( in, a, sizeof(a) ) };
if(r!=sizeof(a)) {
fprintf(stderr, "Could not read complete array.");
return 1;
}
if(r<0) {
perror("Read error");
close(in);
return 1;
}
close(in);

for(unsigned int i(0); i<sizeof(a)/sizeof(int); ++i) {
printf("%d ", a[i]);
}
printf("\n");

return 0;
}

Скомпилируйте и выполните:

$ g++ -std=c++0x -Wall -Wextra tin.cc
$ ./a.out
1 2 3 4 5 6 7 8 9 10

Общие сведения: в вашем коде много мелких проблем (например, проверка на возвращаемые значения полностью отсутствует, включены не все необходимые заголовочные файлы, записано неправильное количество байтов, …) Возможно, вы захотите прочитать другой человек страницы как

$ man 2 open
$ man 2 read
$ man 2 write
$ man 2 close
2

Другие решения

Флаг, который вы используете для открытия второго файла, O_WRONLY не будет создавать выходной файл, если этот файл не существует, вы можете попробовать другие флаги, такие как O_CREATE или же O_APPEND,
это ссылка на сайт должен быть полезен для вас, так как вы можете использовать несколько флагов для управления созданием файла и его поведением во время записи в него!
Удачи =)

1

От OpenGroup

#include <fcntl.h>
...
int fd;
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
char *filename = "/tmp/file";
...
fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, mode);
...

просто сравните с вашим кодом.

0
По вопросам рекламы [email protected]