2013-07-21 44 views
5

Để sao chép nội dung tôi đọc từ tệp đầu vào sang vectơ, tôi đã sử dụng std::copy() như được đề xuất trong Reading an std::ifstream to a vector of lines.Một số byte bị thiếu sau khi đọc tiêu chuẩn :: ifstream đến một vectơ của dòng

Vấn đề xảy ra nếu tôi sử dụng:

std::copy(std::istream_iterator<unsigned char>(inputfile), 
      std::istream_iterator<unsigned char>(), 
      std::back_inserter(myVector)); 

Byte thứ 16 của tập tin của tôi là mất tích trong biến myVector.

Nhưng nếu tôi sử dụng đoạn mã sau:

inputfile.read((char*)&myVector[0], sizeof(int)*getfilesize(nameOfFile)); 

Sau đó các byte không thiếu nữa.

Tôi đang cố gắng phân tích các tệp WAV và tôi mất quá nhiều thời gian cho việc này, tôi hy vọng tôi sẽ tìm hiểu điều gì đó mới mẻ này. Bạn có thể vui lòng cho tôi biết điều gì sai với phiên bản đầu tiên của mã ở trên không?

+1

Phiên bản đầu tiên đang sử dụng chức năng nhập được định dạng, do đó bỏ qua, ví dụ: những gì nó diễn giải là khoảng trắng. – dyp

+1

Tệp có được mở ở chế độ nhị phân trong cả hai trường hợp không? –

+0

Có, tôi không thay đổi bất cứ điều gì ngoại trừ ở trên. Tôi đã sử dụng ifstream như; std :: ifstream inputfile (nameOfFile.c_str(), std :: ifstream :: trong | std :: ifstream :: binary); –

Trả lời

6

istream_iterator sử dụng operator >> để đọc các phần tử, nhưng operator >> bỏ qua khoảng trắng.

Bạn có thể thử sử dụng noskipws

inputfile >> noskipws; 

§ 24.6.1 p1. (Tôi nhấn mạnh)

Lớp mẫu istream_iterator là một iterator đầu vào (24.2.3) mà đọc (sử dụng toán tử >>) tiếp yếu tố từ input stream mà nó được xây dựng ....

+0

... iff cờ bỏ qua được đặt, mặc định là theo mặc định. – dyp

+0

Cảm ơn ít nhất là tốt để học những điều mới. –

+1

Một giải pháp tốt hơn nếu bạn muốn đọc các byte nhị phân. có thể sử dụng 'std :: istreambuf_iterator'. –

1

Trước hết file wav là một dữ liệu nhị phân, vì vậy bạn nên đối xử với nó như vậy, bạn nên mở tập tin của bạn trong chế độ nhị phân:

ifstream ifs; 
ifs.open ("test.wav", ifstream::in | ifstream::binary); 

Sau đó, bạn phải sử dụng hoặc chức năng đọc nhị phân hoạt động như bạn đã nói.

ifstream documentation

+0

lý do tại sao tôi nhận được downvote? – nio

5

Giống như Riad nói, istream_iterator độ hoạt động định dạng đầu vào thông qua operator >>. Giải pháp là sử dụng đọc chưa được định dạng trên bộ đệm cơ bản. Để thực hiện việc này, hãy sử dụng istreambuf_iterator:

std::copy(std::istreambuf_iterator<char>(inputfile), 
      std::istreambuf_iterator<char>(), 
      std::back_inserter(myVector)); 
+1

Không nên là 'char' cho' std :: ifstream'? – dyp

+0

@DyP Phải, tôi * luôn * phạm sai lầm đó. –

Các vấn đề liên quan