我正在尝试编写将在一个文件中读取的代码(在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);
}
}
答案 0 :(得分:6)
char xyz[3] = "XYZ"; trywrite = write(XYZ, &xyz, 120);
这是你的主要问题。当你只有3时,你试着写120.你还有其他问题:
read
和write
返回 read
和write
不会返回int
,而是ssize_t
open(path, 0)
有效,但您应该使用O_RDONLY
void main
,而不是正确的int main
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个字符