【问题标题】:writing bad data with open(), read() and write() [duplicate]使用 open()、read() 和 write() 写入错误数据 [重复]
【发布时间】:2017-10-22 14:46:55
【问题描述】:

我试图在读取、写入和打开的帮助下将 c 中两个输入文件的内容复制到一个文件中。起初我试图简单地复制一个包含“你好”世界的文件的内容,但这是写的: “你好 h«Ú^?^@^@^A^@^@^@^@^@^@^@m G«Ú^?^@^@^@^@^@^@^@^@^@^ @^Pjh«Ú^?^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^ @þ^?^@^@°h«Ú^?^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^Hh«Ú^?^@^@P)»Ó " 我的代码是:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc , char *argv[]){
int fd1,fd2,fdout;
int fread1, fread2;
char buff[128];
int fconf(int f1, int f3){
fd1 = open(argv[1],O_RDONLY);

fdout = open(argv[2],O_RDONLY | O_CREAT | O_APPEND | O_RDWR);
fread1 = read(fd1,buff,sizeof(buff));    
write(fdout,buff,sizeof(buff));
 close(fd1);    
 close(fdout);
 return 0;
 }
}

我不知道为什么会这样。

【问题讨论】:

  • 你传递sizeof buff作为你想用write写入的字节数。那总是 128。read 返回实际读取的字节数。此外,检查错误是一个非常好的主意,您可以在相应函数的文档中找到如何执行此操作。
  • 'fread1 = read(fd1,buff,sizeof(buff));'.. 那么你忽略'fread1'的值:(
  • man read: '成功时,返回读取的字节数'
  • 为什么要将O_RDONLYO_RDWR 都传递给第二个open

标签: c


【解决方案1】:

您的输入文件可能少于 128 个字节。但是您总是尝试将缓冲区中的所有 128 个字节写入输出文件。读取后的字节是未初始化的垃圾。

使用read 的返回值知道你实际得到了多少字节。

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多