2012-09-29 22 views
0

我可以发送非常大的文本文件没有问题。我尝试发送一个JPG等,它不会工作。该文件是正确的大小。我不知道我在想什么。我通过在发送到temp.foo文件之前写入数据来检查我的读取和写入功能。我检查它,它处理任何事情。通过套接字发送二进制文件。文本文件的工作,没有别的呢?

我把它像这样

for(vector<....>::iterator it = v.begin(); it!=v.end(); ++it){ 
    pair<...> p=*it; 
    send(s,p.first,p.second,0); 
} 

那么其他的程序读取有关处理二进制数据,它

for(i = 0; i < size; i+=max){ 
    b= 0; 
    while (b== 0) { 
     if ((b = recv(s, buf, max, 0)) == -1) { 
      perror("recv"); 
      exit(1); 
     } 
} 
    stringstream ss; 
    ss << buf; 
    char * out = (char*)malloc(b); 
    memcpy(out,buff,numbytes);// Perhaps my error is here? 
} 
// write function call here 
+1

显示如何打开文件,可能是在文本模式下打开它们。 – Dani

+0

嗨Dani。如果您按照底部的链接,我将包含读/写方法。我有他们二进制。 r/w很好,但在阅读,发送和写作之间会发生什么? – L4nce0

回答

4

一些一般性的要点:

  1. 确保您打开输入并以二进制模式输出文件,例如ios::binary标志或"rb""wb"格式。默认值是文本模式,它将在二进制文件中压缩行尾字符。

  2. 二进制文件可以有NUL个字节(\0),这意味着您不能使用对NUL终止的字符串起作用的字符串处理函数。 C字符串不是NUL安全的。例如,该代码将无法填补ss正确,因为它解释buf为NULL结尾的字符串:

    stringstream ss; 
    ss << buf; 
    

此外,在你指出的线,是buff有两个f是个错字?在其他线路上,您可以参考buf,其中一个f

memcpy(out,buff,numbytes);// Perhaps my error is here? 
+0

哦,这只是一个错字。我调用ss.str()。c_str()。我正在用myFile的\t(fn,ios :: out | ios :: binary)读取它; – L4nce0

+0

呵呵。不久我将它改回来。它开始工作。这可能是过度劳累的程序员的情况。 – L4nce0