4

我正在尝试编写代码(用 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

4 回答 4

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

这是你的主要问题。当您只有 3 个时,您正在尝试编写 120。您还有其他问题:

  • 你没有检查什么readwrite返回
  • read并且write不要返回int,但是ssize_t
  • open(path, 0)有效,但你应该使用O_RDONLY
  • 您正在使用void main而不是正确的int main
  • 正如乔纳森莱弗勒指出的那样,你应该使用buffer而不是&buffer
于 2013-09-04T20:03:36.783 回答
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
}

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

于 2013-09-04T20:15:31.777 回答
0

改变这个你写的是 120 个字节而不是 3 个字节

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

建议:删除 while 循环中的声明,您在 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);
  }
于 2013-09-04T20:05:04.590 回答
0

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

于 2013-09-04T20:06:47.347 回答