Форум программистов, компьютерный форум CyberForum.ru

Считать в строку из бинарного файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.63
a91
 Аватар для a91
4 / 4 / 0
Регистрация: 03.04.2009
Сообщений: 190
28.10.2011, 10:09     Считать в строку из бинарного файла #1
Здравствуйте!

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

C++
1
2
3
4
5
6
7
8
9
10
11
 char* str;
 str = new char [20];
 
 FILE *f;
 
 if( (f=fopen("file.txt","rb")) == NULL) puts("err"); // int fread(void *ptr, unsigned size, unsigned count, FILE *f);
 while(!feof(f)) fread(&str,sizeof(char),1,f);
 
 fclose(f);
 
 printf("%s",str);
В чем может быть дело
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
28.10.2011, 10:23     Считать в строку из бинарного файла #2
Цитата Сообщение от a91 Посмотреть сообщение
fread(&str,sizeof(char),1,f);
Вы считываете 1 char
-=ЮрА=-
Заблокирован
Автор FAQ
28.10.2011, 10:32     Считать в строку из бинарного файла #3
Цитата Сообщение от a91 Посмотреть сообщение
Как считать в строку данные из бинарного файла
Пишу сразу в редакторе форума так что не обессутте
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
long sLen;
char * str;
FILE * f = fopen("fPath","rb+");
if(!f)
    printf("Error open\n");
else
{
    fseek(f,0,SEEK_END);//Указатель вконец файла
    sLen = ftell(f);//Получаем длинну файла
    fseek(f,0,SEEK_SET);//Указатель вначало файла
    if(!(str = (char *)malloc((sLen + 1)*sizeof(char))))
         printf("Allocation memory error\n");
    else
    {
         fread(str,sLen,1,f);
         str[sLen] = '\0';//Терминатор вконце строки обязательно!
    }
    fclose(f);
    if(str){}//В теле if организуем действия со считанной инфой из файла - она вся в str
}
Добавлено через 51 секунду
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
fopen("fPath","rb+")
- для этого нужен stdio.h
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
malloc
- для этого нужен stdlib.h

Добавлено через 2 минуты
Цитата Сообщение от a91 Посмотреть сообщение
fread(&str,sizeof(char),1,f);
- если Вы хотите заполнить str сделайте вот так fread(str,20*sizeof(char),1,f);
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
28.10.2011, 10:34     Считать в строку из бинарного файла #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
malloc
Судя по new в первом посте, не обязательно пользоваться именно malloc
И кошерней
C++
1
fread(str,sizeof(char),sLen,f);
-=ЮрА=-
Заблокирован
Автор FAQ
28.10.2011, 10:38     Считать в строку из бинарного файла #5
Цитата Сообщение от a91 Посмотреть сообщение
char* str;
*str = new char [20];
- во первых зачем на двух строках?
C++
1
char*str = new char [20];
Во вторых зачем new char ????
C
1
char str[20];
- и вперёд
В третьих
Цитата Сообщение от a91 Посмотреть сообщение
new char
Цитата Сообщение от a91 Посмотреть сообщение
printf
- вы используете одновременно как С++ так и Си - это програмный суржик!Выделение памяти на Си осуществляется malloc.

a91, Ваш алгоритм должен быть на Си или С++???

Добавлено через 1 минуту
Цитата Сообщение от mimicria Посмотреть сообщение
И кошерней
- НЕ КОШЕРНЕЙ!Я сам так делал, пока не прочитал внимательно о прототипе fread!Кошерней так как написал ранее fread(str,20*sizeof(char),1,f);

Добавлено через 1 минуту
mimicria, ознакомьтесь внимательно с параметрами fread
http://www.cplusplus.com/reference/c.../cstdio/fread/

Parameters
ptr
Pointer to a block of memory with a minimum size of (size*count) bytes.
size
Size in bytes of each element to be read.
count
Number of elements, each one with a size of size bytes.
stream
Pointer to a FILE object that specifies an input stream.
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
28.10.2011, 10:39     Считать в строку из бинарного файла #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
НЕ КОШЕРНЕЙ!Я сам так делал, пока не прочитал внимательно о прототипе fread!
Поделитесь с публикой, в чём секрет. Описание параметров fread явно говорит
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
size - Size in bytes of each element to be read. - Размер элемента
count - Number of elements, each one with a size of size bytes. - Количество элементов

Размер элемента - sizeof(char)
Количество - sLen
Так что всё-таки
C++
1
fread(str,sizeof(char),sLen,f);
-=ЮрА=-
Заблокирован
Автор FAQ
28.10.2011, 10:46     Считать в строку из бинарного файла #7
mimicria, для вас перевожу на русский
fread ( void * ptr, size_t size, size_t count, FILE * stream );

ptr
Указатель на блок памяти с минимальным размером (size*count) байт.
size
Размер в БАЙТАХ! каждого элемента который будет считан
count
ЧИСЛО ЭЛЕМЕНТОВ, каждый из которых размером size байт

Не по теме:

Будем дальше холиворить или мне попросить кого-то из "Гуру" в своё время "вставивших мне пистон" за это и Вам его вставить???



Добавлено через 2 минуты
Дословно так
str[20]
C
1
fread(str,sizeof(char),20,f);
// Не 20 по 1-му
а правильно
C
1
fread(str,20*sizeof(char),1,f);
//20 символов в 1-ну сроку
Да оно отработает и так и так но кошерней не так как Вы написали
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
28.10.2011, 10:46     Считать в строку из бинарного файла #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
для вас перевожу на русский
Я прекрасно перевожу сам. В вашем примере 1 элемент размера sLen, в моём sLen элементов размера sizeof(char). Потому что массив у нас из char, а не из элементов размера sLen. Именно так, как в описании функции fread.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Будем дальше холиворить или мне попросить кого-то из гуру в своё время "вставивших мне пистон" за это и Вам его вставить???
У вас с этим явно какие-то проблемы, успокойтесь уже. Критику надо воспринимать правильно.
-=ЮрА=-
Заблокирован
Автор FAQ
28.10.2011, 10:53     Считать в строку из бинарного файла #9

Не по теме:


Цитата Сообщение от mimicria Посмотреть сообщение
Именно так, как в описании функции fread.

mimicria, я реально написал Вам как правильно, и сам до недавнего времени писал как и Вы, а потом мне объяснили, давайте не холиворить, или выносим топик на общее обсуждение?
Вы сами критику не воспринимаете, не вопрос в паре топиков Вам удалось меня уколоть, т.к. в основном я невнимателен и пропускаю некие казусы, но на счёт fread вы не правы вот и всё.



Добавлено через 4 минуты

Не по теме:

mimicria, в конце концов char str[20] - это 20*sizeof(char) элемент, нам его нужно считать 1 раз, в вашей же интерпритации - это 20 отдельных чаров которые считываем 20 раз - вдумайтесь...

mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
28.10.2011, 10:56     Считать в строку из бинарного файла #10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а потом мне объяснили
Вам объяснили неверно.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вы сами критику не воспринимаете
Конструктивную очень даже воспринимаю. Поскольку сам человек, которому свойственно ошибаться. Но я не буду с пеной у рта отстаивать неправильные суждения.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
на счёт fread вы не правы вот и всё.
Вот и всё - это не аргумент.
Чтобы ещё раз пояснить свою точку зрения перевод описания fread:
size - Size in bytes of each element to be read. - Размер элемента
count - Number of elements, each one with a size of size bytes. - Количество элементов
Для массива int a[20] размер элемента = sizeof(int), количество элементов = 20. И точка.
-=ЮрА=-
Заблокирован
Автор FAQ
28.10.2011, 11:14     Считать в строку из бинарного файла #11
mimicria, это вы какой то бешенный с пеной у рта
Ємм я никогда таким не страдал
По-моему разница есть
C
1
2
3
4
5
struct tmp
{
  char s[20];
};
fread(&tmp.s,sizeof(tmp),1,f);
C
1
2
3
4
5
struct tmp
{
   char s;
}
fread(&tmp.s,sizeof(tmp),1,f);
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
28.10.2011, 11:37     Считать в строку из бинарного файла #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
По-моему разница есть
Конечно есть, структуры же разные
Вы только что привели пример как считать 1 элемент типа tmp.
А для 2-х:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct tmp
{
 char s[10];
};
 
int main()
{
 FILE *f;
 tmp ff[2];
 f=fopen("file.txt","rb");
 fread(&ff,sizeof(tmp),2,f);
 fclose(f);
}
-=ЮрА=-
28.10.2011, 11:57
  #13

Не по теме:

mimicria, я пошёл в другой топик, ТС всё равно на наши замечания неотреагировал, а вас переубждать я устал, хотя можите вот так записать
fread(&ff,sizeof(ff),1,f); - и как говориться не изобретать велосипед

mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
28.10.2011, 12:00     Считать в строку из бинарного файла #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
хотя можите вот так записать
fread(&ff,sizeof(ff),1,f); - и как говориться не изобретать велосипед
Можем то мы можем. Но я повторюсь, это не кошерно. Вот Вы сами подумайте, у Вас этот параметр ВСЕГДА равен 1, зачем он тогда вообще нужен был?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2011, 12:18     Считать в строку из бинарного файла
Еще ссылки по теме:

Считать из бинарного файла в массив структур фамилию, имя, оценку по математике, оценку по информатике C++
C++ Считать рандомную строку из файла
C++ Считать вторую строку из файла
Записать и считать информацию из бинарного файла C++
C++ Считать определенную строку из файла

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
silent_1991
28.10.2011, 12:18     Считать в строку из бинарного файла
  #15

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ємм я никогда таким не страдал
Ємм именно этим вы и страдаете.



 Комментарий модератора 
Если оффотпик не закончится - влеплю спорщикам по карточке.
Yandex
Объявления
28.10.2011, 12:18     Считать в строку из бинарного файла
Ответ Создать тему
Опции темы

Текущее время: 17:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru