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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
#1

Хитрый fstream - C++

11.03.2010, 11:47. Просмотров 1525. Ответов 2
Метки нет (Все метки)

Привет всем!

Вот есть код, казалось бы без ошибок...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <windows.h>
#include <fstream>
#include <vector>
#include <string>
#include <stdio.h>
 
using namespace std;
string mem;
int pos;
 
int FileLength(iostream &f)
{
  f.seekg(0,ios::end);
  int L=f.tellg();
  f.seekg(0,ios::beg);
  return L;
};
 
void LoadFile(string FN)
{
  fstream f;
  f.open(FN.c_str(),ios_base::in);
  if(!f)return;
  int L=FileLength(f); mem.resize(L);
  f.read(&mem[0],L);
  f.close(); pos=0;
};
 
int main(int argc, char* argv[])
{
  LoadFile("GameScene.qap");
  for(int i=3800;i<3900;i++)
    printf("[%i] = '%X'\n",i,(unsigned char)mem[i]);
  system("pause");
  return 0;
}
гарантировано, что размер входного файла больше 5кб.

Вот интересно, почему этот код не читает некоторые файлы... точнее читает, но не до конца? У меня такое предчувствие, что ему не безразлично что у них внутри...
ps: WinXP, MSVC++ 2005.
Тестовый пример, на котором проявляется ошибка:
Вложения
Тип файла: rar Any.rar (3.2 Кб, 10 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2010, 11:47     Хитрый fstream
Посмотрите здесь:

Хитрый комментарий - C++
Когдато давно в этом разделе я выложил задачу, которая с виду была элементарна, но содержала интересный хак, из-за которого она работала...

Хитрый обход дерева в глубину - C++
По условию необходимо обойти дерево так чтобы найти путь max длины не имеющий кратных вершин, приэтом советуют пользоваться алгоритмом с...

Самый хитрый код (Несерьезная тема) - C++
Вот, собственно нашел в интернете код #include &lt;cstdio&gt; double m= {7709179928849219.0, 771}; int main() { ...

На Дваче анон поднял хитрый пример на тему ++i, растолкуйте мне, гики, а то я так ничего и не понял - C++
Цитирую...

Работа с fstream - C++
Вопрос такой: какие методы есть в fstream (если конечно есть) для того, чтобы удалить файл? Мне надо именно через fstream. system(&quot;del...

cstdio vs fstream - C++
Есть программа, виводящяя 16-ричный дамп бинарного файла (вместо каждого байта входного файла виводится значение в 16-ричной системе) Для...

fstream::setbuf - C++
вот тут написано о этом методе: http://msdn.microsoft.com/en-us/library/aa243826(VS.60).aspx но при этом VC6.0 на такой код: ...

из cstdio в fstream - C++
вод программа, написанная через функцию cstdio #include &quot;stdafx.h&quot; #include &lt;cstdio&gt; #include &lt;iostream&gt; #pragma warning(disable:...

Write из fstream - C++
Здравствуйте!) Не могу понять, как пишет данные в файл функция write( То есть мы с помощью seekp указали позицию в потоке (файле) и...

не найден fstream.h ..... - C++
#include &lt;iostream&gt; #include &lt;fstream.h&gt; #include &quot;int.h&quot; using namespace std; fatal error C1083: Cannot open include file:...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
11.03.2010, 12:08  [ТС]     Хитрый fstream #2
Cделал файл покороче.
немного поправил код:
C++
1
2
3
4
5
6
7
8
9
10
11
int main(int argc, char* argv[])
{
  LoadFile("GameScene.qap");
  for(int i=0;i<mem.size();i++)
  {
    if(i%8==0)printf("\n"); printf("%.2X ",(unsigned char)mem[i]); 
  };
  printf("\n");
  system("pause");
  return 0;
}
то на выходе будет это:
Код
42 65 67 69 6E 20 68 65
72 65 00 4B 00 00 00 00
00 00 00 01 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
Для продолжения нажмите любую клавишу . . .
Миниатюры
Хитрый fstream  
Вложения
Тип файла: rar GameScene.rar (113 байт, 8 просмотров)
Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
11.03.2010, 12:26  [ТС]     Хитрый fstream #3
может надо как-то указать, что у меня файл бинарный?

Добавлено через 10 минут
а вот-так всё верно читает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void LoadFile(string FN)
{
  fstream f;
  f.open(FN.c_str(),ios_base::in);
  if(!f)return;
  int L=FileLength(f); mem.resize(L); 
  f.close(); pos=0;
  //////////////////////////////////
  FILE *file;
  file = fopen(FN.c_str(),"rb"); 
  fgets(&mem[0],L,file);
  fclose(file);
  //f.readsome(&mem[0],L);
  //////////////////////////////////
};
Код
42 65 67 69 6E 20 68 65
72 65 00 4B 00 00 00 00
00 00 00 01 00 00 00 1A
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 00
Для продолжения нажмите любую клавишу . . .
Добавлено через 4 минуты
нашёл...
[ссылка удалена]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
#include <iomanip>
 
int main ( int argc, char **argv ) {
 
    if ( 2 != argc ) {
        std::cout << "Usage : " << argv[0] << std::endl;
        return 1;
    }
 
    std::ifstream in ( argv[1], std::ios_base::in, std::ios_base::binary );
    if ( !in.is_open() ) {
        std::cout << "Failed to open : " << argv[1] << std::endl;
        return 2;
    }
 
    int i = 0;
    while ( in.good() ) {
        char data = 0;
 
        std::fstream::pos_type previous_pos = in.tellg();
        in.read ( & data, sizeof ( char ) );
        std::fstream::pos_type current_pos = in.tellg();
 
        std::cout 
            << "#" << i++ << " ... 0x" << std::hex << std::setw ( 2 ) << std::setfill('0') << static_cast <int> ( data )
            << " ... good ? " << std::boolalpha << in.good() << " ... " << std::dec << previous_pos << "/" << current_pos << std::endl;
    }
 
    in.close();
    return 0;
}
как раз то что надо .

Всем спасибо!
Yandex
Объявления
11.03.2010, 12:26     Хитрый fstream
Ответ Создать тему
Опции темы

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