[英]How can I read and write from files using the headers fcntl.h and unistd.h?
I'm trying to learn how to use the header files <fcntl.h>
and <unistd.h>
. 我正在尝试学习如何使用头文件
<fcntl.h>
和<unistd.h>
。 I have created a small example to test the workings of their procedures, but it didn't work as expected. 我已经创建了一个小例子来测试他们的程序的工作情况,但它没有按预期工作。 Here is my code:
这是我的代码:
#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;
}
The input file was: 1 2 3 4 5 6 7 8 9 10
输入文件是:
1 2 3 4 5 6 7 8 9 10
The program compiled normally, but it didn't create any output files. 该程序正常编译,但它没有创建任何输出文件。 Could anyone tell me what is wrong with my code?
谁能告诉我我的代码有什么问题? Thanks in advance.
提前致谢。
Divide et impera. 划分et impera。
The part for writing: 写作部分:
#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;
}
When compiled and executed: 编译和执行时:
$ g++ -std=c++0x -Wall -Wextra tout.cc
$ ./a.out
it writes out the 'a' array: 它写出'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
Please note that this is not portable - each compiler / architecture might have some different output here. 请注意,这不是可移植的 - 每个编译器/体系结构在这里可能有一些不同的输出。
Here is the part to read this in again and write it to stdout: 以下是再次阅读此内容并将其写入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;
}
Compile and execute: 编译并执行:
$ g++ -std=c++0x -Wall -Wextra tin.cc
$ ./a.out
1 2 3 4 5 6 7 8 9 10
General: In your code there are a lot of small issues (like: checking for return values is completely missing, not all needed header files are included, wrong number of bytes is written, ...) You might want to read the different man pages like 一般:在你的代码中有很多小问题(如:检查返回值是完全缺失,不是所有需要的头文件都包括在内,错误的字节数写,...)你可能想读不同的人这样的页面
$ man 2 open
$ man 2 read
$ man 2 write
$ man 2 close
The flag you use for opening the second file, O_WRONLY
will not create the output file is this one don't exist, you may want to try other flags, like O_CREATE
or O_APPEND
. 用于打开第二个文件的标志,
O_WRONLY
将不会创建输出文件,如果这个不存在,您可能要尝试其他标志,如O_CREATE
或O_APPEND
。 This link should be useful to you, as you may want to use several flags to handle file creation and behavior while writing in it ! 此链接应该对您有用,因为您可能希望在写入时使用多个标志来处理文件创建和行为! Good luck =)
祝你好运=)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.