Ik krijg het niet voor elkaar om met std::ofstream.seekp() te werken. Ik krijg altijd een corrupt bestand. Het gaat mis bij de volgende code
Hou ik daarentegen het bestand open, en zoek ik niet in het bestand, dan gaat het wel goed. Ik moet dan alleen wel de netjes alles in de goede volgorde aan de functie aangeven. De volgende code werkt in dit geval dus wel:
Ik controleer hier dus of de write position correct is, door de uitkomst van tellp() te vergelijken met wat ik verwacht. Dit doe ik in het eerste geval ook, en na de seekp() werkt dit ook. Alleen, het eerste geval creëert een corrupt bestand en ik heb geen idee waar dat door kan komen. De reden dat ik dit werkend wil krijgen is dat dan de gegevens in willekeurige volgorde kunnen worden geschreven.
out_file is een member variabele van de class file, article is een smart pointer naar een gedecodeerd usenet artikel. Hoe krijg ik seekp() werkend?
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| inline void file::write_part(segment *the_segment, ::nntp::decoded_article_ptr decoded) { boost::mutex::scoped_lock lock(write_mutex); // make sure we are the only ones messing with segments std::string filename; // cache file name std::string data; // cache decoded data // get the filename and data from the decoded article decoded->filename(filename, false); decoded->data(data); // open file out_file.open(filename.c_str(), std::ios_base::binary | std::ios_base::out); // if it is a multipart binary, seek to the right position if (decoded->multipart()) out_file.seekp(decoded->begin() - 1); // did we arrive at the right position? if (decoded->multipart() && out_file.tellp() != decoded->begin() - 1) std::cout << "File '" << filename << "', segment " << the_segment->segment_number() << " at position " << out_file.tellp() << ", expected to be at " << decoded->begin() - 1 << std::endl; // write the data out_file.write(data.c_str(), data.length()); // close the file out_file.close(); } |
Hou ik daarentegen het bestand open, en zoek ik niet in het bestand, dan gaat het wel goed. Ik moet dan alleen wel de netjes alles in de goede volgorde aan de functie aangeven. De volgende code werkt in dit geval dus wel:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| inline void file::write_part(segment *the_segment, ::nntp::decoded_article_ptr decoded) { boost::mutex::scoped_lock lock(write_mutex); // make sure we are the only ones messing with segments std::string filename; // cache file name std::string data; // cache decoded data // get the filename and data from the decoded article decoded->filename(filename, false); decoded->data(data); // open file if necessary if (!out_file.is_open()) out_file.open(filename.c_str(), std::ios_base::binary | std::ios_base::out); // are we at the right spot? if (decoded->multipart() && out_file.tellp() != decoded->begin() - 1) std::cout << "File '" << filename << "', segment " << the_segment->segment_number() << " at position " << out_file.tellp() << ", expected to be at " << decoded->begin() - 1 << std::endl; // write the data out_file.write(data.c_str(), data.length()); // close the file if (the_segment->segment_number() == segment_list.size()) out_file.close(); } |
Ik controleer hier dus of de write position correct is, door de uitkomst van tellp() te vergelijken met wat ik verwacht. Dit doe ik in het eerste geval ook, en na de seekp() werkt dit ook. Alleen, het eerste geval creëert een corrupt bestand en ik heb geen idee waar dat door kan komen. De reden dat ik dit werkend wil krijgen is dat dan de gegevens in willekeurige volgorde kunnen worden geschreven.
out_file is een member variabele van de class file, article is een smart pointer naar een gedecodeerd usenet artikel. Hoe krijg ik seekp() werkend?
Ik ontken het bestaan van IE.