2013-08-22 5 views
0

я извлечения данных из файла (theta.txt'), используя ifstreamC++ - ошибка сегментации при закрытии ifstream

std::ifstream theta_extracter("theta.txt", std::ifstream::in); 
std::string line; 
std::vector <double> thetas; 

    /* For each line in file until EOF */ 
while (true){ 
    getline(theta_extracter, line); /* Get line */ 

    if (theta_extracter.eof()) break; /* Stop at EOF*/ 

    std::stringstream stream(line); /* Parse Line */ 
    std::string exported; 

    /*Parse line*/ 
    while (true){ 
     stream >> exported; 
     thetas.push_back(atof(exported.c_str())); /* Store value*/ 
     if (stream.eof()) break;  
    } 
} 

theta_extracter.close(); 

Если я не закрываю theta_extracter, я получаю огромное сообщение об ошибке:

*** glibc detected *** ./combi: free(): invalid next size (fast): 0x0000000000b69ba0 *** 
======= Backtrace: ========= 
/lib64/libc.so.6[0x36c98760e6] 
/lib64/libc.so.6[0x36c9878c13] 
./combi[0x405964] 
./combi[0x4042ca] 
./combi[0x402e95] 
./combi[0x40266f] 
./combi[0x401e19] 
./combi[0x401471] 
/lib64/libc.so.6(__libc_start_main+0xfd)[0x36c981ecdd] 
./combi[0x4012c9] 
======= Memory map: ======== 
00400000-0040d000 r-xp 00000000 00:2a 59351995       /nfs/stak/students/m/moissinb/WORKSPACE/EXP3/VCG Solver/combi 
0060c000-0060d000 rw-p 0000c000 00:2a 59351995       /nfs/stak/students/m/moissinb/WORKSPACE/EXP3/VCG Solver/combi 
00b5f000-00c4a000 rw-p 00000000 00:00 0         [heap] 
36c9400000-36c9420000 r-xp 00000000 fd:00 2613       /lib64/ld-2.12.so 
36c961f000-36c9620000 r--p 0001f000 fd:00 2613       /lib64/ld-2.12.so 
36c9620000-36c9621000 rw-p 00020000 fd:00 2613       /lib64/ld-2.12.so 
36c9621000-36c9622000 rw-p 00000000 00:00 0 
36c9800000-36c998a000 r-xp 00000000 fd:00 5271       /lib64/libc-2.12.so 
36c998a000-36c9b89000 ---p 0018a000 fd:00 5271       /lib64/libc-2.12.so 
36c9b89000-36c9b8d000 r--p 00189000 fd:00 5271       /lib64/libc-2.12.so 
36c9b8d000-36c9b8e000 rw-p 0018d000 fd:00 5271       /lib64/libc-2.12.so 
36c9b8e000-36c9b93000 rw-p 00000000 00:00 0 
36c9c00000-36c9c83000 r-xp 00000000 fd:00 5272       /lib64/libm-2.12.so 
36c9c83000-36c9e82000 ---p 00083000 fd:00 5272       /lib64/libm-2.12.so 
36c9e82000-36c9e83000 r--p 00082000 fd:00 5272       /lib64/libm-2.12.so 
36c9e83000-36c9e84000 rw-p 00083000 fd:00 5272       /lib64/libm-2.12.so 
36cfc00000-36cfc16000 r-xp 00000000 fd:00 5275       /lib64/libgcc_s-4.4.7-20120601.so.1 
36cfc16000-36cfe15000 ---p 00016000 fd:00 5275       /lib64/libgcc_s-4.4.7-20120601.so.1 
36cfe15000-36cfe16000 rw-p 00015000 fd:00 5275       /lib64/libgcc_s-4.4.7-20120601.so.1 
36d0400000-36d04e8000 r-xp 00000000 fd:03 548265       /usr/lib64/libstdc++.so.6.0.13 
36d04e8000-36d06e8000 ---p 000e8000 fd:03 548265       /usr/lib64/libstdc++.so.6.0.13 
36d06e8000-36d06ef000 r--p 000e8000 fd:03 548265       /usr/lib64/libstdc++.so.6.0.13 
36d06ef000-36d06f1000 rw-p 000ef000 fd:03 548265       /usr/lib64/libstdc++.so.6.0.13 
36d06f1000-36d0706000 rw-p 00000000 00:00 0 
7fc067c6a000-7fc067c6f000 rw-p 00000000 00:00 0 
7fc067c96000-7fc067c99000 rw-p 00000000 00:00 0 
7fff52f65000-7fff52f7a000 rw-p 00000000 00:00 0       [stack] 
7fff52fff000-7fff53000000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
Abort (core dumped) 
.

Если я закрыть его, это SEG вина в этой точке.

Любые идеи о том, что происходит не так?

+0

Вы когда-нибудь выяснили, в чем проблема? – phonetagger

+0

Я все еще работаю над этим, но у меня есть другие задачи, которые нужно закончить, прежде чем я смогу снова взглянуть на это. Я отправлю сообщение, как только у меня это получится! –

ответ

0
while (getline(theta_extracter, line)){ 
..... 
while (stream >> exported){ 
      thetas.push_back(atof(exported.c_str())); /* Store value*/ 
     } 
} 

Я думаю, вам следует сделать это!

+0

У меня нет проблем с извлечением данных из файла. Я могу распечатать тета и получить именно то, что ожидалось. Проблема заключается в том, когда я закрываю theta_extracter или просто завершаю функцию. –

+0

Также этот способ также будет извлекать EOF, поэтому каждый последний элемент строки будет там дважды. –

0

Я не притворяюсь, что это какой-то ответ. Я просто публикую свои собственные результаты &, прося вас проверить это на свое ...

Я предполагаю, что у вас есть другой код, который вы не показываете. Мне интересно, является ли ваш другой код источником проблемы; возможно, это развращает что-то еще в памяти, возможно, стек? Во всяком случае, вот мой весь тест (минус необходимые #includes), который работает без сбоев в моем Linux x86. Что делает этот код в вашей системе?

int main() { 

    std::cout << "Beginning..." << std::endl; 
    std::ifstream theta_extracter("theta.txt", std::ifstream::in); 
    std::string line; 
    std::vector <double> thetas; 

    /* For each line in file until EOF */ 
    while (true){ 
     getline(theta_extracter, line); /* Get line */ 
    std::cout << "\nLine: \"" << line << "\"" << std::endl; 

     if (theta_extracter.eof()) break; /* Stop at EOF*/ 

     std::stringstream stream(line); /* Parse Line */ 
     std::string exported; 

     /*Parse line*/ 
     while (true){ 
      stream >> exported; 
      std::cout << "exported = \"" << exported << "\"" << std::endl; 
      thetas.push_back(atof(exported.c_str())); /* Store value*/ 
      if (stream.eof()) break; 
     } 
    } 

// I get the same results whether I close theta_extractor or not.... 
// theta_extracter.close(); 

    std::vector<double>::iterator thit = thetas.begin(); 
    while (thit != thetas.end()) { 
     std::cout << ' ' << *thit; 
     ++thit; 
    } 
    std::cout << "\n\n...done.\n"; 
} 
+0

@ Bibi541 - Кстати, хотя ваш код работает нормально, пока на последней строке файла .txt есть новая строка, структурируя ваши строки «Стоп в EOF», так как у вас их нет. Я бы сделал что-то вроде 'while (! Theta_extractor.eof())' вместо 'while (true)', а затем отказался от 'if (...) break;'. Аналогичная проблема с другим 'while (true)'. – phonetagger

0

Вы, кажется, испортили память, написав внешний буфер. Это не в коде, который вы показываете. Вы, должно быть, что-то пропустили.

Смежные вопросы