2016-10-30 3 views
0

Я пишу программу на C, где мне нужно прочитать файл и распечатать каждую строку длиной не менее 4 символов. У меня проблема с распределением памяти для использования. Строки могут быть сколь угодно длинными. Я пытаюсь malloc буфер к размеру файла, а затем освобождать его в конце, но я явно пропускаю что-то важное. Вот мой код:free(): недопустимый следующий размер (быстрый)

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

int main(int argc, char **argv) { 
    FILE *f = fopen(argv[1], "r"); 
    char *buffer = malloc(8 * sizeof(f)); 
    char ch; 
    int i = 0; 

    while(fread(&ch, 1, 1, f) != 0) { 
    if((ch >= 32 && ch <= 126) || ch == 9) { 
     buffer[i++] = ch; 
    } 
    else { 
     buffer[i] = '\0'; 
     if (i >= 4) { 
     printf("%s\n", buffer); 
     } 
     i = 0; 
    } 
    } 

    free(buffer); 
    fclose(f); 
    return 0; 
} 

Запуск этого с файлом правильно выводит все строки (1 в каждой строке), а затем дает мне сообщение об ошибке.

*** glibc detected *** ./mystrings: free(): invalid next size (fast): 0x0000000000601250 *** 
======= Backtrace: ========= 
/lib64/libc.so.6[0x34ff676166] 
/lib64/libc.so.6[0x34ff678ca3] 
./mystrings[0x4006e9] 
/lib64/libc.so.6(__libc_start_main+0xfd)[0x34ff61ed1d] 
./mystrings[0x400569] 
======= Memory map: ======== 
00400000-00401000 r-xp 00000000 00:1a 94896226       /afs/pitt.edu/home/a/s/asm122/private/cs449/project2/mystrings 
00600000-00601000 rw-p 00000000 00:1a 94896226       /afs/pitt.edu/home/a/s/asm122/private/cs449/project2/mystrings 
00601000-00622000 rw-p 00000000 00:00 0         [heap] 
34fee00000-34fee20000 r-xp 00000000 fd:00 127       /lib64/ld-2.12.so 
34ff01f000-34ff020000 r--p 0001f000 fd:00 127       /lib64/ld-2.12.so 
34ff020000-34ff021000 rw-p 00020000 fd:00 127       /lib64/ld-2.12.so 
34ff021000-34ff022000 rw-p 00000000 00:00 0 
34ff600000-34ff78b000 r-xp 00000000 fd:00 131       /lib64/libc-2.12.so 
34ff78b000-34ff98a000 ---p 0018b000 fd:00 131       /lib64/libc-2.12.so 
34ff98a000-34ff98e000 r--p 0018a000 fd:00 131       /lib64/libc-2.12.so 
34ff98e000-34ff98f000 rw-p 0018e000 fd:00 131       /lib64/libc-2.12.so 
34ff98f000-34ff994000 rw-p 00000000 00:00 0 
3505a00000-3505a16000 r-xp 00000000 fd:00 609       /lib64/libgcc_s-4.4.7-20120601.so.1 
3505a16000-3505c15000 ---p 00016000 fd:00 609       /lib64/libgcc_s-4.4.7-20120601.so.1 
3505c15000-3505c16000 rw-p 00015000 fd:00 609       /lib64/libgcc_s-4.4.7-20120601.so.1 
7ffff7fd3000-7ffff7fd6000 rw-p 00000000 00:00 0 
7ffff7ffa000-7ffff7ffe000 rw-p 00000000 00:00 0 
7ffff7ffe000-7ffff7fff000 r-xp 00000000 00:00 0       [vdso] 
7ffffffea000-7ffffffff000 rw-p 00000000 00:00 0       [stack] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
Aborted (core dumped) 

Я уверен, что это глупая ошибка, если у кого-нибудь есть идеи, как решить это, пожалуйста, дайте мне знать. Спасибо!

+0

(быстрый)? вы тоже хотите кофе? – Stargateur

ответ

0

sizeof(f) возвращает размер fуказатель, а не размер файла.

Вы можете прочитать о том, как получить размер файла здесь: How can I get a file's size in C?

Однако, лучший подход может быть использование fgets: https://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm

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

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