Я пытаюсь узнать, как использовать заголовочные файлы <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
Программа компилировалась нормально, но не создавала никаких выходных файлов. Может кто-нибудь сказать мне, что не так с моим кодом? Заранее спасибо.
Разделяй и властвуй.
Часть для написания:
#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
Флаг, который вы используете для открытия второго файла, O_WRONLY
не будет создавать выходной файл, если этот файл не существует, вы можете попробовать другие флаги, такие как O_CREATE
или же O_APPEND
,
это ссылка на сайт должен быть полезен для вас, так как вы можете использовать несколько флагов для управления созданием файла и его поведением во время записи в него!
Удачи =)
От 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);
...
просто сравните с вашим кодом.