Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> И снова malloc, Выделяет больше чем нужно 
V
    Опции темы
FiMa1
Дата 27.2.2007, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



В файле "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;
}

PM   Вверх
Fazil6
Дата 27.2.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

получаю указатель 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';

так по идее должно быть
PM MAIL   Вверх
Бонифаций
Дата 27.2.2007, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 1
Всего: 40



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


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

смотрим man fgets




Это сообщение отредактировал(а) Бонифаций - 27.2.2007, 19:07


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
Rockie
Дата 27.2.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Код

return filelength(fileno(fp));

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

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

filelength

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

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





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Kuvaldis
Дата 28.2.2007, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Fazil6, 
Код

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

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

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



--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
FiMa1
Дата 28.2.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Всем большое спасибо, все разъяснилось! ИМХО -> Форум всегда славился быстрыми и доходчивыми ответами умных людей... Последним еще раз спасибо!
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.