使用系统调用读/写

时间:2013-09-04 19:58:42

标签: c

我正在尝试编写将在一个文件中读取的代码(在C中),并写入已创建的文件。我正在努力的唯一部分是while循环,它应该连续读写,直到文件结束。我得到前120个字符,写入它们,然后将'XYZ'写入文件,但是当我再次尝试读/写时,我得到^ @和一堆垃圾。我不想要如何做到这一点的解决方案,只要告诉我我做错了什么/忘了做什么。

#include <sys/types.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

void main()
{
  int a, b, c;
  int XYZ = creat("XYZ.doc", 777);
  if(XYZ<0) {
    printf("error with creat");
    exit(0);
  }
  int xxxx = open("/usr/class/cis660/xx.xx", 0);
  if(xxxx<0) {
    printf("error with open");
    exit(0);
  }
  int tryread = 1;
  int trywrite;
  while (tryread > 0) {
    char buffer[120];
    tryread = read(xxxx, &buffer, 120);
    trywrite = write(XYZ, &buffer, 120);
    char xyz[3] = "XYZ";
    trywrite = write(XYZ, &xyz, 120);
  }
}

4 个答案:

答案 0 :(得分:6)

char xyz[3] = "XYZ";
trywrite = write(XYZ, &xyz, 120);

这是你的主要问题。当你只有3时,你试着写120.你还有其他问题:

  • 您没有查看readwrite返回
  • 的内容
  • readwrite不会返回int,而是ssize_t
  • open(path, 0)有效,但您应该使用O_RDONLY
  • 您使用的是void main,而不是正确的int main
  • 正如Jonathan Leffler所指出的那样,你应该使用buffer代替&buffer

答案 1 :(得分:3)

你的循环应该只尝试写入读取的字节数:

int nread;
char buffer[120];
while ((nread = read(xxxx, buffer, sizeof(buffer)) > 0)
    int nwritten = write(XYZ, buffer, nread);
    if (nwritten != nread)
        ...short write error...
    char xyz[3] = "XYZ"; // Not a null terminated string
    nwritten = write(XYZ, xyz, sizeof(xyz));
    // ...check this write too
}

请注意,代码不会,也不应该使用&buffer&xyz,与问题中的代码不同。原始代码尝试使用超出xyz数组末尾的数据进行写入;它也没有正确处理短写,并且当它获得EOF时会第二次写满最后一个缓冲区。

答案 2 :(得分:0)

更改此项,您正在写入120个字节而不是三个字节

trywrite = write(XYZ, &xyz, 120);  =>trywrite = write(XYZ, &xyz, 3);

建议:在

之前添加声明的while循环中删除声明
  char buffer[120];
    char xyz[3] = "XYZ"; 
 while (tryread > 0) {

    tryread = read(xxxx, &buffer, 120);
    trywrite = write(XYZ, &buffer, 120);

    trywrite = write(XYZ, &xyz, 120);
  }

答案 3 :(得分:0)

垃圾是由于您尝试写入XYZ的120个字节,您实际上正在写入3个字符