2015-01-31 3 views
0

Функция, которая считывает потоки файлов и печатает их на экране, вызывает неопределенное поведение, и я не могу локализовать причину. Это работает, если загружен файл, содержащий менее двух строк, иначе он сработает.Сценарий для загрузки файлов не работает из-за поводной причины

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <inttypes.h> 

char *getText (FILE* fp) 
{ 
    uint_64 size; 
    uint_64 i = 0; 
    int chr; 
    char *source; 

    fseek(fp, 0L, SEEK_END); 
    size = ftell(fp); 

    source = calloc(size + 1, sizeof(char)); 

    fseek(fp, 0, SEEK_SET); // rewind 

    while(chr != EOF) 
     source[i++] = (chr = fgetc(fp)); 

    source[size] = '\0'; // Terminate string 

    return(source); 
} 

int main(void) 
{ 
    char sfile [256]; 
    FILE* fp; 
    char *file; 
    char buff [256]; 

    printf("Enter name of file: "); 
    scanf("%s", sfile); 

    if(!strncmp(sfile, "read-", strlen("read-"))) 
    { 
     fp = fopen(sfile + strlen("read-"), "r"); 
     file = getText(fp); 

     sprintf(buff, file); 
     printf(buff); 

     fclose(fp); 
     free(file); 
    } 

    return 0; 
} 
+1

Вы должны быть немного более конкретными, чем «неопределенное поведение» , Что делает программа? Является ли он детерминированным (всегда делает то же самое или следует какой-то схеме)? Какую отладку вы уже пробовали? – aruisdante

+0

Я решил, что он сработает, если строки потока файлов> 2 и я уже это описал. Программа обычно срабатывает немедленно .. иногда она сбой срабатывает .. иногда при завершении, иногда появляется текст, а затем падает, иногда он вообще не появляется. –

+0

вы пытались использовать gdb, чтобы увидеть * почему * он сбой? Получаете ли вы какой-либо текст ошибки при сбое? Вы уверены, что это не просто заканчивается чисто так, как вы этого не ожидаете? – aruisdante

ответ

0

После удаления ненужной проверки имен файлов, программа падает, когда размер входного файла> 256 байт, из-за

char buff [256]; 
... 
file = getText(fp); 
... 
sprintf(buff, file); 
+0

Ahh да .. ну, я не превышаю его. Реальная среда имеет немного другое использование функции (вместо этого используется встроенный буфер). но это дало мне представление. Поскольку я искал исходный код движка, этот конкретный буфер был как таковой, статически выделен. Поэтому я могу по-настоящему превзойти его. –

+0

'file = getText (fp);' назначает указатель на буфер, выделенный для * всего * файла. –

+0

Да. Да. Должно. –