2013-11-26 200 views
-1

如何在C++中的char数组中逐行读取二进制文件? 这样的:二进制C++中的文件读取

struct packet 
{ 
    unsigned int ack; 
    char data[994]; 
    int sequence_number; 
    unsigned long checksum; 
    int lenghtFile; 
}dummy; 

fstream file1; 
file1.open("filename.txt",ios::binary); 

if(!file1) 
{ 
    cout<<"\n error opening file \n"; 
} 
else 
{ 
    while(1) 
    { 
     if(file1.eof()!=0) 
      {break;} 
     else 
     {// 
      file1.read(dummy.data,994); 
      sendto(connfd,(struct packet*)&dummy,sizeof(struct packet),0, 
        (sockaddr*)&server,sizeof(server)); 
     } 
    } 
} 
+0

如何被存储在文本文件中的数据? – woolstar

+1

什么不适合你? – jxh

+0

'二进制行文件'我现在停止阅读了。 –

回答

0

此:

while(1) 
{ 
    if(file1.eof()!=0) 
     {break;} 
    else 
    {// 
     file1.read(dummy.data,994); 
     sendto(connfd,(struct packet*)&dummy,sizeof(struct packet),0,(sockaddr   *)&server,sizeof(server)); 
    } 

...看起来像它的作品了作为基本模拟while (!file1.eof()),很多答案谈论本质上是有保证的问题的长篇大论方式。我可能会写为:

while (file1.read(...)) 
    sendto(...); 

我想,但是,我想更进一步,和过载至少operator>>(以及可能operator>>)为packet类型:

struct packet { 
    // ... 

    friend std::istream &operator>>(std::istream &is, packet &p) { 
     return is.read(p.data, sizeof(p.data)); 
    } 

    // and possibly:  
    friend UDP_iterator operator<<(udp_iterator &c, packet &p) { 
     return sendto(c.fd, &p, sizeof(p), 0, c.server, sizeof(c.server)); 
    } 
}; 

...其中udp_iterator将类似于ostream_iterator,但会写入套接字而不是流。请注意,有许多类似的课程。大多数提供了一个连接到TCP套接字的流缓冲类,但是UDP套接字不应该增加任何困难。

有了这些正确超载,你应该能够将数据从文件像这样的东西复制到插座:

std::copy(std::istream_iterator<packet>(file1), 
      std::istream_iterator<packet>(), 
      UDP_iterator<packet>(server));