在将数据读入缓冲区时读取额外字符

时间:2015-01-11 14:54:51

标签: c++ file-io fstream

我正在编写一个程序,通过文件读取后通过管道发送数据。有时代码工作正常,但有时一些额外的字符被读取。但代码工作得很好,BUF_SIZE是1.我猜我正在阅读一些额外的或垃圾数据,但我无法弄清楚在哪里。

额外字符如:

  

AEOI

#include <iostream>
#include <fstream>
#include <sys/wait.h>
#include <unistd.h>

using namespace std;

#define BUF_SIZE 512

int main(){
    int fd[2];
    char buf[BUF_SIZE];
    pipe(fd);
    switch(fork()){
       default:{
            close(fd[1]);
            fstream o;
            o.open("out.txt",fstream::trunc|fstream::out);
            int numread;
            while(1){
                numread=read(fd[0],buf,BUF_SIZE);
                if(numread<0) continue;
                if(numread==0) break;
                o<<buf;
            }
            o.close();
            close(fd[0]);
            wait(NULL);
            break;
       }
       case 0:
            close(fd[0]);
            ifstream inp("in.txt");
            char buf2[BUF_SIZE];
            while(inp){
                inp.read(buf2,BUF_SIZE);
                if(inp.gcount()!=0)
                    write(fd[1],buf2,inp.gcount());
            }
            inp.close();
            close(fd[1]);
    }
}

1 个答案:

答案 0 :(得分:2)

变化

char buf[BUF_SIZE];

char buf[BUF_SIZE+1];

并插入

buf[numread]=0;

o<<buf;

否则buf包含由read接收的数据背后的垃圾数据,并且o&lt;&lt; buf将复制该垃圾数据,直到找到'\0'