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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
whitefox
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 19
#1

Чтение из бинарного файла - C++

07.10.2011, 12:33. Просмотров 1296. Ответов 12
Метки нет (Все метки)

Ну собственно,у меня есть некий двоичный файл,в него записана моя информация в двоичном виде,требуется считать эту информацию и вывести на экран.Перепробовал уже кучу способов,выдает "левые" символы,значки всякие.Подскажите пожалуйста как это сделать правильно?И умоляю,не надо перекидывать меня на другие темы,где читают числа из двоичного файла,я их пересмотрел и делал похожим методом,но все равно не помогло.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2011, 12:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение из бинарного файла (C++):

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется - C++
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

Чтение бинарного файла - C++
подскажите пожалуйста как можно из любого файла(*.bmp, *.mp3, *.avi и т.д.) получить двоичное представление этого файла или хотя бы считать...

Чтение бинарного файла - C++
Здравствуйте. Есть код чтения бинарного файла: FILE *f; string tmp; char buff = {0}; f = fopen("data.bin", "rb"); if(f ==...

Чтение бинарного файла - C++
как получить доступ к произвольному адресу файла? Нужно отправить файл через ком порт но не с 0 а с адреса 1а000 в цикле по 0х100 байт. с 0...

Чтение из бинарного файла - C++
Здравствуйте. У меня имеется некий класс Product, объекты которого хранятся в объекте класса Vector. Есть функция записи вектора в бинарный...

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

12
Thinker
Эксперт С++
4229 / 2203 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 12:34 #2
Как записывали, так и считывать, что тут трудного то.
0
whitefox
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 19
07.10.2011, 12:36  [ТС] #3
Я ведь написал,при считывании выдает набор других символов,которые мне не нужны.Вообщем,у меня почему то читается мусор,вместо нужного мне текста.Кстати да,имя файла нам дано,пусть это будет некая переменная FileName.
0
Thinker
Эксперт С++
4229 / 2203 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 12:37 #4
Код покажите, все станет на свои места
0
whitefox
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 19
07.10.2011, 12:40  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
int ReadBinaryFile(char *FileName)
{
char str[128];
ifstream fd(FileName,ios::in||ios::out||ios::binary);
while(!fd.eof())
{
 fd>>str;
 cout<<str<<endl;
}
fd.close();
return(1);
}
 Комментарий модератора 
Используйте теги форматирования кода!
0
Thinker
Эксперт С++
4229 / 2203 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 12:42 #6
А ничего что внутреннее представление чисел отличается от их изображений? А записывали как файл?
0
whitefox
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 19
07.10.2011, 12:44  [ТС] #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
char *WriteText(char FileName[50],char FileNameArg[50])
{
FILE *fp;fp=fopen(FileNameArg,"r");
char str[256];int len;char *NewFileName=strcat(FileName,".bin");
FILE *fd;fd=fopen(NewFileName,"wb");
if((!fp))
  {
    printf("Error!\n");
    exit(1);
  }
  else
  {
while((fgets(str,256,fp))!=NULL)
  {
  len=strlen(str);
  fwrite(&len,1,1,fd);
  fwrite(str,len,1,fd);
  }
  }
  fclose(fp);
  fclose(fd);
  return NewFileName;
}
Вот функция записи,правда там мне пришлось записывать с помощью fwrite,ибо препод настоял на этом,а про чтение сказал,делай,что хочешь))По условию задачи я там выделяю из файла data.txt "data" и образую имя нового двоичного файла data.bin.
0
Thinker
Эксперт С++
4229 / 2203 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
07.10.2011, 12:51 #8
А теперь точно также считывайте с помощью fread отдельно строки и числа и все получится
C
1
2
fread(&len,1,1,fd);
fread(str,len,1,fd);
1
whitefox
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 19
07.10.2011, 12:58  [ТС] #9
Вот с функцией fread я не до конца разобрался,ибо она требует размер,ну или длину,которую надо считать.Я пытался ее найти через fseek,но и там тоже засада полная.Вылезла куча ошибок и я решил попытаться по другому.Кроме как fread,по-другому не считать?Если да,то помогите написать код считывания.Подскажите как правильно использовать,а то я уже 2 день голову ломаю.
0
Байт
Нарушитель
Эксперт C
16674 / 10935 / 1676
Регистрация: 24.12.2010
Сообщений: 21,319
07.10.2011, 13:04 #10
Цитата Сообщение от whitefox Посмотреть сообщение
Вот с функцией fread я не до конца разобрался,ибо она требует размер,ну или длину,которую надо считать.Я пытался ее найти через fseek,но и там тоже засада полная.Вылезла куча ошибок и я решил попытаться по другому.Кроме как fread,по-другому не считать?Если да,то помогите написать код считывания.Подскажите как правильно использовать,а то я уже 2 день голову ломаю.
Ты же перед строкой записал ее длину. Считывай длину, а по ней и строку.
C
1
2
fread(&len, sizeof(int), 1, fd);
fread(str, len, 1, fd);
Удачи!
0
whitefox
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 19
07.10.2011, 13:12  [ТС] #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int ReadBinaryFile(char *FileName)
{
char str[128];int len;
FILE *fd=fopen(FileName,"rb");
if(!fd)
{
cout << "Error open file!" << endl;
return 1;
}
fread(&len,1,1,fd);
fread(str,len+1,1,fd);
printf("%s",str);
fclose(fd);
return(1);
}
Ну он теперь стал выдавать слова,но вместе с ними все равно есть мусор.После слов набор левых символов.Откуда они берутся,подскажите пожалуйста.
0
Байт
Нарушитель
Эксперт C
16674 / 10935 / 1676
Регистрация: 24.12.2010
Сообщений: 21,319
07.10.2011, 14:28 #12
whitefox, Ты писал длиной len Вот такой же длиной и читай
Да еще поставь нулик в конце
C
1
str[len] = '\0';
Добавлено через 2 минуты
Ты записал строку без конечного нуля. Так же она и прочтется.
И помни, что в Си массивы (и символы строк) нумеруются с нуля.
2
whitefox
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 19
07.10.2011, 15:20  [ТС] #13
При добавлении строки
C++
1
str[len]='\0'
вылезает ошибка
Access violation at address 004014F9.Write of address 0025FDBD.Что это значит?Эту строку нужно добавлять при записи строки в файл или уже при чтении?Прошу простить меня за мою тупость,но очень хочу понять и разобраться.

Добавлено через 14 минут
Теперь выдает 2 слова нормально,а 2 слова с лишними символами...
0
07.10.2011, 15:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2011, 15:20
Привет! Вот еще темы с ответами:

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

Чтение бинарного файла - C++
Привет! Необходима помощь в таком вопросе - Создал программу для хранения сведений о пользователях(типа такого: введите сведения: ...

Чтение из бинарного файла - C++
Создала Базу данных. запись в файл происходит, а чтение из файла не получается. исправьте, пожалуйста, или подскажите как? #include...

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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