3

我正在尝试学习如何使用头文件<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

该程序正常编译,但没有创建任何输出文件。谁能告诉我我的代码有什么问题?提前致谢。

4

3 回答 3

4

分而治之。

写作部分:

#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

请注意,这不是可移植的——每个编译器/体系结构在这里可能有一些不同的输出。

这是再次读入并将其写入标准输出的部分:

#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
于 2012-12-22T15:27:23.287 回答
2

您用于打开第二个文件的标志,O_WRONLY不会创建输出文件是这个不存在,您可能想尝试其他标志,如O_CREATEor O_APPEND。这个链接应该对你有用,因为你可能想使用几个标志来处理文件的创建和行为,同时在其中写入!祝你好运=)

于 2012-12-22T14:06:52.867 回答
0

来自公开组

#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);
...

只需与您的代码进行比较。

于 2012-12-22T14:05:27.383 回答