2013-11-19 5 views
0

Я бы преобразовал двоичный файл с одним или несколькими Pascal-Strings в .Txt-файл. Это правильный путь, но он выглядит как ошибка сегментации. Я не понимаю, где проблема. Размер файла 23.Сегментация терпит неудачу? Зачем?

void printFile(char *buffer, char *output_file, int file_size) 
{ 
    FILE *out_file = fopen(output_file, "w"); 
    int i = 0; 
    int j = 1; 
    int cnt = 0; 
    int cnt_word = 0; 
    int block = 4; 

    while (i < block) 
    { 
    cnt = cnt + buffer[i]; 
    i++; 
    } 

    while (j <= cnt) 
    { 
    while (i < file_size) 
    { 
     while (i < (i + block)) 
     { 
     cnt_word = cnt_word + buffer[i]; 
     i++; 
     } 

     while (i < (i + cnt_word)) 
     { 
     fprintf(out_file, "%c", buffer[i]); 
     i++; 
     } 

     fprintf(out_file, " "); 
     cnt_word = 0; 
     j++; 
    } 
    } 

    fclose(out_file); 
} 

Это в другой функции get filesize:

fseek(in_file, 0, SEEK_END); 
file_size = ftell(in_file); 
rewind(in_file); 

//allocate memory for buffer 
buffer = malloc(file_size); 
+2

Вы не видите функцию вызова, поэтому мы не знаем размер «буфера». Скорее всего, вы превысите размер массива. Запустите его в отладчике. – OldProgrammer

+0

Насколько велик буфер? Также с таким количеством циклов while я могу только представить, что один из них бесконечно запускает переполнение стека. –

+1

while (i <(i + block)) может ли это условие выйти из строя? – sukunrt

ответ

2
while (i < (i + block)) 

Здесь блок 4, я не вижу, как это условие может не

+0

уверено, что он не работает – Gabson

+1

Я бы сказал, что это не выполняется для 'i> (INT_MAX-block)'. – alk

+0

Поскольку он обращается к массиву в цикле, я бы сказал, что он будет segfault перед ним. – sukunrt

2

Строки паскаля IIRC сохраняются с длиной в качестве первого байта, так как они не сохраняются с завершающим \ 0 как C-строки:

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

Вы можете начать, просто установив буфер на \ 0 с помощью calloc, а затем поместив туда текст, чтобы убедиться, что буфер \ 0-завершен.

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