2013-11-26 4 views
-1

C++의 문자 배열에서 한 줄씩 이진 파일을 읽는 방법은 무엇입니까? 이 같은 :바이너리에서 파일 읽기 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 (!file1.eof()) 시뮬레이션의 장황한 방법을 작동처럼

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.read(...)) 
    sendto(...); 

나는 한 단계 더 가고 싶어하지만, 과부하 packet 유형에 대한 최소한 operator>> (그리고 아마도 operator>>) :

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_iteratorostream_iterator과 유사하지만 스트림 대신 소켓에 쓰게됩니다. 비슷한 종류의 클래스가 많이 있습니다. 대부분은 TCP 소켓에 연결하는 스트림 버퍼 클래스를 제공하지만 UDP 소켓은 큰 어려움을 추가해서는 안됩니다.

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