[英]How can I read and write from files using the headers fcntl.h and 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
该程序正常编译,但它没有创建任何输出文件。 谁能告诉我我的代码有什么问题? 提前致谢。
划分et impera。
写作部分:
#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
。 此链接应该对您有用,因为您可能希望在写入时使用多个标志来处理文件创建和行为! 祝你好运=)
#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);
...
只需与您的代码进行比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.