Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2015, 19:49   #11
mibin
Пользователь
 
Регистрация: 29.01.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Вы читаете не текст, откуда знаете что внутри прочитанного не используется '\0' ?
Вот это уже идея. И судя по всему верная...strlen возвращает другое значение(все равно не верное, но это уже объяснение какое-то) на другом файле...так...а почему sizeof фигню возвращает?
mibin вне форума Ответить с цитированием
Старый 29.03.2015, 19:55   #12
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от mibin Посмотреть сообщение
Вот это уже идея. И судя по всему верная...strlen возвращает другое значение(все равно не верное, но это уже объяснение какое-то) на другом файле...так...а почему sizeof фигню возвращает?
А что ему ещё вернуть. Вы запросили размер указателя, он его и вернул. sizeof может вернуть размер массива:
Код:
    char ar[5];
    sizifof(ar);
при условии что тип не потерян (не пропустили в функцию через аргументы, можно через tempate)
220Volt вне форума Ответить с цитированием
Старый 29.03.2015, 20:11   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Хотелось сделать процедуру, которая определит размер буфера.
Она у тебя уже есть:
Код:
fseek(f, 0, SEEK_END);
	fsize = ftell(f);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.03.2015, 20:21   #14
mibin
Пользователь
 
Регистрация: 29.01.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Она у тебя уже есть:
Код:
fseek(f, 0, SEEK_END);
	fsize = ftell(f);
Это не она, эта процедура определяет размер файла а не буфера.

А теперь внимание смешное:
Код:
void proc(char* ch) {
	cout << "[PROC_2] Size of string = " << strlen(ch) << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	FILE *f;
	int fsize = 0;

	f = fopen("D:\\probar.png", "rb");

	fseek(f, 0, SEEK_END);
	fsize = ftell(f);
	rewind(f);

	char* buf = new char[fsize + 1];

	int nr = fread(&buf, sizeof(char), fsize, f);

	buf[fsize] = '\0';
	cout << "Read number = " << nr << endl;

	fclose(f);

	cout << "File size = " << fsize << endl;
	proc(buf);

	int i;
	cin >> i;

	return 0;
}
Вот этот код верно определяет размер буфера в Visual C++ и не верно в Embarcadero C++

Последний раз редактировалось Stilet; 29.03.2015 в 21:05.
mibin вне форума Ответить с цитированием
Старый 29.03.2015, 21:08   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Это не она, эта процедура определяет размер файла а не буфера.
У тебя буфер равен размеру файла. И мое мнение: Ты зря буфер ASCIIZ-ом сделал тем паче для бинарного контента.
У тебя есть fsize. Вот им и пользуйся.
Кстати, это так, к сведению: Все твои потуги сведутся к нулю, если в png файле твоем есть нулевой символ.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.03.2015, 21:24   #16
mibin
Пользователь
 
Регистрация: 29.01.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Кстати, это так, к сведению: Все твои потуги сведутся к нулю, если в png файле твоем есть нулевой символ.
Тут согласен...об это я тоже думал..

Цитата:
У тебя есть fsize. Вот им и пользуйся.
Внутрь процедуры я хочу передавать любую строку и определять ее длинну...будь она считанная из файла или написанная вручную.
mibin вне форума Ответить с цитированием
Старый 29.03.2015, 22:05   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

хотите передавать строку так передавайте строку, а не байты. тип char* не значит что это строка.
картинки не текстовые файлы, их не стоит трактовать как текст.

второе, вы пытаетесь слишком универсализировать. пусть тот кто считал данные их размер и передаст. тогда у вас и из файла будет размер и из консоли.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.03.2015, 22:11   #18
mibin
Пользователь
 
Регистрация: 29.01.2009
Сообщений: 22
По умолчанию

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

Вот совсем другое что функция strlen ориентируется на символ '\0' при подсчете кол-ва байтов...а sizeof не умеет считать динамически выделенный массив.

Последний раз редактировалось Stilet; 29.03.2015 в 22:47.
mibin вне форума Ответить с цитированием
Старый 29.03.2015, 22:48   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Внутрь процедуры я хочу передавать любую строку и определять ее длинну
Передавай параметром. Если параметр -1 - то использовать strlen() для определения, если положительное число - то считать его за длину строки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.03.2015, 22:53   #20
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Байтами кодируется символ...печатный он или нет.
Пусть это не текстовая строка в нашем понимании, но я думал в понимании компа пофигу...последовательность символов она и есть последовательность символов.
текстовый файл => бинарный файл, но не в обратную сторону.

Цитата:
Вот совсем другое что функция strlen ориентируется на символ '\0' при подсчете кол-ва байтов...а sizeof не умеет считать динамически выделенный массив.
а на что по вашему должен ориентироваться strlen? явно на какое-то значение, ведь магии нет, и комп чудом не узнает где кончается ваша последовательность.

я вам вариант предложил, что с ним делать дело ваше.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить размер физического диска? Robin_ Общие вопросы Delphi 7 18.01.2016 07:11
Как определить размер видеостраницы axeforever12009 Помощь студентам 2 18.06.2013 17:01
Как определить размер структуры stpdqstns Общие вопросы C/C++ 10 30.01.2013 19:02
неопределённый размер строки типа char _KUL Общие вопросы C/C++ 4 16.05.2012 19:54
Как в Delphi определить размер файла? Nomad Помощь студентам 7 10.08.2010 08:33