
Interprocess newbie question. I’m trying to use interprocess to print a data file to possibly improve the speed of my code. I’ve attached a code sample to the bottom. The code compiles with msn cl compiler, but segfaults with gcc (4.3.2). Two questions: Is it possible to produce a file that is not junked up with binary at the beginning and end? Any ideas why it seg-faults with gcc? Thanks in advance. --Alex #include <boost/interprocess/managed_mapped_file.hpp> #include <boost/interprocess/streams/bufferstream.hpp> #include <boost/filesystem/path.hpp> #include <boost/filesystem/operations.hpp> #include <exception> #include <iostream> #include <vector> int main( int /*argc*/, char** /*argv*/ ) { using namespace std; using namespace boost; //Initialize the data to be printed size_t dataSetSize = 10; vector<double> coordinate(dataSetSize); vector<double> magnitude (dataSetSize); for( size_t i = 0; i < dataSetSize; ++i){ coordinate[i] = static_cast<double>(i); magnitude [i] = static_cast<double>(2*i) + static_cast<double>(2*i)/1e10; } vector<string> banner(2); banner[0]="this is my data file banner\n"; banner[1]="file end"; string fileName("fileMapperTest.out"); try{ using namespace filesystem; using namespace interprocess; //Remove the file if it already exists path fileNamePath(fileName); if( exists(fileNamePath) ) remove(fileNamePath); size_t dataWidth = 20; size_t bufferSize = banner[0].size()+2*dataSetSize*(dataWidth+3)+banner[1].size(); //map the file managed_mapped_file tstFileMap( create_only, fileName.c_str(), 2*bufferSize); cout << "file was mapped" << endl; //create a buffer char *aString = tstFileMap.construct<char>("aString") [bufferSize](); cout << "the buffer was constructed" << endl; //stream into the buffer bufferstream testFileBuff(aString, bufferSize, ios_base::out); testFileBuff.precision(dataWidth-5); cout.precision(dataWidth-5); cout << "the buffer stream was constructed" << endl; //Start printing testFileBuff << banner[0] << "\n"; for( size_t i = 0; i < dataSetSize; ++i){ testFileBuff << coordinate[i] << " " << magnitude [i] << "\n"; cout << coordinate[i] << " " << magnitude [i] << "\n"; } testFileBuff << banner[1] << endl; tstFileMap.destroy_ptr(aString); } catch(interprocess::interprocess_exception& e) { cout << "An interprocess exception was thrown ..." << endl; cout << e.what() << endl; } catch(...) { cout << "An unknown exception was thrown ..." << endl; } return 0; } My file output: [binary junk]... 0 0 1 2.0000000002 2 4.0000000004 3 6.0000000006 4 8.0000000008 5 10.000000001 6 12.0000000012 7 14.0000000014 8 16.0000000016 9 18.0000000018 file end [more binary junk]