Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > И снова malloc


Автор: FiMa1 27.2.2007, 17:31
В файле "test" три символа - "abc". Определяется размер файла, он используется в качестве размера для динамически распределяемого массива. Соответственно, при выделении памяти malloc-ом, расчитываю выделить 3 байта и загрузить данные в массив. Вместо этого (IDE MS VS 7.0) получаю указатель str на строку вида "НННээээ««««««««ю" = 16 Byte. Поправьте меня, пожалуйста.
Код

#include <stdio.h>
#include <io.h>

inline long getfsize(FILE *fp)
{
    return filelength(fileno(fp));
}

int main(void)
{
    FILE    *fp;
    char    *str;
    long    bufsize;

    if((fp=fopen("test", "r" ))==NULL) {
        printf("The file was not opened\n");
        exit(1);
    }
    
    bufsize = getfsize(fp);
    
    str = (char *)malloc(bufsize);

    if(fread(str, sizeof(char), bufsize, fp) != bufsize) {
        if(feof(fp)) {
            cout << "EOF was untimely found\n"; 
        }
        else { 
            cout << "Error ocurred during file read!\n";
        }
    }

    free(str);
    fclose(fp);

    return 0;
}

Автор: Fazil6 27.2.2007, 17:40
Цитата

получаю указатель str на строку вида "НННээээ««««««««ю" = 16 Byte

ты видишь то, что дебагер смог проинтепретировать как строку по этому адресу, т.е. с выделенного адреса до первого встреченного нуля

Добавлено @ 17:42 
Код

str = (char *)malloc(bufsize + 1);

    if(fread(str, sizeof(char), bufsize, fp) != bufsize) {
        if(feof(fp)) {
            cout << "EOF was untimely found\n"; 
        }
        else { 
            cout << "Error ocurred during file read!\n";
        }
    }

str[bufsize] = '\0';

так по идее должно быть

Автор: Бонифаций 27.2.2007, 19:06
Цитата(Fazil6 @  27.2.2007,  17:40 Найти цитируемый пост)
так по идее должно быть 


нет. fread читает не строки а блоки данных . К тому что считал fread нельзя относится как к строке, внутри считанных данных вполне могут быть нули.

смотрим man fgets



Автор: Rockie 27.2.2007, 19:13
Код

return filelength(fileno(fp));

Симпатишное решение, вот только 
Цитата

Переносимость filelength уникальна для DOS.

http://www.codenet.ru/progr/cpp/spr/110.php

Лучше узнавать размер открытого текстового файла таким образом:
Код

    fseek(fp, 0, SEEK_END);
    long bufsize = ftell(fp);
    fseek(fp, 0, SEEK_SET);



Автор: Kuvaldis 28.2.2007, 12:54
Fazil6, 
Код

str = (char *)malloc(bufsize + 1);
    if(fread(str, sizeof(char), bufsize, fp) != bufsize) 

Надо быть последовательным. Если уж sizeof() ипользовать, то везде (для переносимости)
т.е.
Код

str = (char *) malloc( (bufsize + 1) * sizeof(char) );

Автор: FiMa1 28.2.2007, 17:37
Всем большое спасибо, все разъяснилось! ИМХО -> Форум всегда славился быстрыми и доходчивыми ответами умных людей... Последним еще раз спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)