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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.63
a91
4 / 4 / 0
Регистрация: 03.04.2009
Сообщений: 190
#1

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

28.10.2011, 10:09. Просмотров 3393. Ответов 14
Метки нет (Все метки)

Здравствуйте!

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

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);
В чем может быть дело
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2011, 10:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считать в строку из бинарного файла (C++):

Как считать из бинарного файла - C++
Здравствуйте, я написала процедуру считывания из бинарного файла, но в результате выводится непонятный набор букв. Как сделать что бы...

Записать и считать информацию из бинарного файла - C++
Здравствуйте уважаемые программисты. Дано задание: Написать программу,которая создает в каталоге 2 файла - текстовый и бинарный,и...

Как считать числа из бинарного файла - C++
Стоит задача: записать простые числа в бинарный файл. Числа берутся из промежутка 1...n. Все сделал, но не получается вывести в консоль...

Как считать из бинарного файла AnsiString (ifstream)? - C++
ifstream read("Edit1.txt",std::ios::binary); int Size; read.read((char*)&Size,sizeof(int)); AnsiString str; ...

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

Считать строку из файла - C++
Как считать вторую строку из файла до пробела в элемент N, а после пробела в элемент K Пример файла: 01110 23 99 1...

14
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
28.10.2011, 10:23 #2
Цитата Сообщение от a91 Посмотреть сообщение
fread(&str,sizeof(char),1,f);
Вы считываете 1 char
0
-=ЮрА=-
Заблокирован
Автор 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);
0
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
28.10.2011, 10:34 #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
malloc
Судя по new в первом посте, не обязательно пользоваться именно malloc
И кошерней
C++
1
fread(str,sizeof(char),sLen,f);
0
-=ЮрА=-
Заблокирован
Автор 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.
0
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
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);
0
-=ЮрА=-
Заблокирован
Автор 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-ну сроку
Да оно отработает и так и так но кошерней не так как Вы написали
0
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
28.10.2011, 10:46 #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
для вас перевожу на русский
Я прекрасно перевожу сам. В вашем примере 1 элемент размера sLen, в моём sLen элементов размера sizeof(char). Потому что массив у нас из char, а не из элементов размера sLen. Именно так, как в описании функции fread.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Будем дальше холиворить или мне попросить кого-то из гуру в своё время "вставивших мне пистон" за это и Вам его вставить???
У вас с этим явно какие-то проблемы, успокойтесь уже. Критику надо воспринимать правильно.
0
-=ЮрА=-
Заблокирован
Автор FAQ
28.10.2011, 10:53 #9

Не по теме:


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

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



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

Не по теме:

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

0
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
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. И точка.
0
-=ЮрА=-
Заблокирован
Автор 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);
0
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
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);
}
0
-=ЮрА=-
28.10.2011, 11:57
  #13

Не по теме:

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

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

Не по теме:

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



 Комментарий модератора 
Если оффотпик не закончится - влеплю спорщикам по карточке.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2011, 12:18
Привет! Вот еще темы с ответами:

Считать строку из файла - C++
int ch; while (ch ==100) { fgets( load_string, ch , file ); cout << load_string << endl; ...

Считать строку с файла - C++
Может дыбильный вопрос, но все же хочу считать строку с файла, при этом хочу что бы на выходе получилось string textv, а не char textv; ...

Считать строку с файла - C++
Как считать строку с файла до определенного символа?? П.с. а строки в файлах не имеют случайно в конце "терминального нуля" (что бы...

Считать рандомную строку из файла - C++
как из файла считать рандомную строку методом чаровского массива?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.10.2011, 12:18
Ответ Создать тему
Опции темы

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