简体   繁体   English

如何使用标头fcntl.h和unistd.h从文件中读取和写入?

[英]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_CREATEO_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 =) 祝你好运=)

From opengroup 来自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);
...

just compare with your code. 只需与您的代码进行比较。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM