C ++ ifstream имеет нечетную ошибку сегмента в зависимости от того, где находится файл на диске - PullRequest
0 голосов
/ 16 февраля 2011

У меня есть некоторый код C ++ (с использованием библиотек ROOT ), который я унаследовал (~ 1,5 тыс. Строк), и одна из первых вещей, которые я пытаюсь сделать, - это устранить ошибку, связанную с открытиеми чтение двоичного файла, который передается в качестве аргумента во время выполнения.Некоторый код, представляющий проблему, будет выглядеть так:

[~/this]$ ./Make_RWQ_Tree /Users/me/this/that/mydata_f00000001.rwq
inFile: ./mydata_f00000001.rwq
outFile: ./mydata_f00000001.tru
Header Info:
a = 12
b = 345
c = 51
N = 100
G = 100
numEventsInFile = 1000
   r = 1
   s = 2
   t = 4
*** Show info for each of the events in the file normally ***

[~/this]$
[~/this]$ mv ./mydata_f00000001.rwq /Users/me/this/that/another/directory/deeper/
[~/this]$ ./Make_RWQ_Tree /Users/me/this/that/another/directory/deeper/mydata_f00000001.rwq
inFile: ./mydata_f00000001.rwq
outFile: ./mydata_f00000001.tru
Header Info:
a = 12
b = 345
c = 51
N = 100
G = 100
numEventsInFile = 1000

 *** Break *** segmentation violation



===========================================================
There was a crash.
This is the entire stack trace of all threads:
===========================================================

#5  0x00007fffffe007c5 in __memcpy ()
#6  0x00007fff87de59f7 in std::basic_streambuf<char, std::char_traits<char> >::xsgetn ()
#7  0x00007fff87dc7b19 in std::basic_filebuf<char, std::char_traits<char> >::xsgetn ()
#8  0x00007fff87dcd8c1 in std::istream::read ()
#9  0x0000000100001e25 in main (argc=<value temporarily unavailable, due to optimizations>, argv=<value temporarily unavailable, due to optimizations>) at Make_RWQ_Tree.cxx:175

Таким образом, в зависимости от того, где находится файл, я получаю ошибку сегмента после , когда он успешно открывается и считывает несколько значений из файла,Строка 175, как сообщается, является просто обычным inFile.read.

Я прошу прощения, что это может быть очень трудно помочь без реальных строк кода, но я не думаю, что могу свести код к небольшой рабочей версииэто иллюстрирует это.У кого-нибудь есть опыт такого рода вещей?

1 Ответ

5 голосов
/ 16 февраля 2011

Кто-то использует фиксированный размер буфера для имен файлов. Посмотрите на код разбора argv или код, который регистрирует имя файла.

...