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

Поблочное чтение из файла - C++

Восстановить пароль Регистрация
 
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
20.09.2011, 23:09     Поблочное чтение из файла #1
Здравствуйте, балуюсь с чтением из файла.
Так вот если читать посимвольно всё в порядке, но больно долго.
А если хитро "буферизированно" читать методом ifstream::read() то быстро но... проблемма... некоторый кусок из конца не читается...

Вот даже
код

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <fstream>
using namespace std;
 
#define filename "file.txt"
#define filesize 2000000
 
void clearfile(void)
{
    ofstream output(filename);
    output<<"\0";
    output.close();
}
 
void genfile(void)
{
    ofstream output(filename);
    for(int i=1;i<=filesize;i++)
    {
        output<<"string under number: "<<i;
        if(i==filesize)
            output<<" end\n";
        else
            output<<'\n';
    }
    output.close();
}
 
void read_one_symbol(string &buffer)
{
    ifstream input(filename);
    char buf;
    while(input>>buf)
    {
        buffer+=buf;
    }
    input.close();
}
 
void read_using_buffer(string &buffer)
{
    ifstream input(filename);
    char buf[1048576]; //1048576
 
    while(input.read(buf,1048576))
    {
        buffer+=buf;
    }
    input.close();
}
 
int main ()
{
    string savehere;
    //clearfile();
    //genfile();
    read_one_symbol(savehere);
    //read_using_buffer(savehere);
    cout<<savehere.substr(savehere.length()-100,100);
    return 0;
}
которым балуюсь.

использование
нужные функции в main раскоментить, нужные закоментить и компльнуть
clearfile() очищает файл (по умолчанию дефайн "file.txt")
genfile() заполняет файл н-ым кол-вом строк (по умолчанию дефайн 2ляма)
read_one_symbol() читает файл посимвольно
read_using_buffer() читает хитро и багано... =)
ну cout<<... естесно проверяем последние строки, считал ли он до конца... заметте что в конце последней строки стоит end)


Так вот, где ошибка? я неправильно пользуюсь, или какая то
фича?
бага?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2011, 23:09     Поблочное чтение из файла
Посмотрите здесь:

Чтение из файла C++
чтение из файла C++
C++ Чтение из файла
Поблочное считывание с файла C++
Чтение из файла. Повторное чтение файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:17     Поблочное чтение из файла #2
Razzeeyy, а что вы хотите сделать с файлом? Просто вывести на экран? Выводите по мере чтения тогда. Если файл текстовый - то читайте в текстовом режиме, например, по словам. Если файл бинарный - то читайте порционно.
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
20.09.2011, 23:23  [ТС]     Поблочное чтение из файла #3
Цитата Сообщение от talis Посмотреть сообщение
Razzeeyy, а что вы хотите сделать с файлом? Просто вывести на экран? Выводите по мере чтения тогда. Если файл текстовый - то читайте в текстовом режиме, например, по словам. Если файл бинарный - то читайте порционно.
Есть надобность читать текстовый файл и загонять в строку (если конкретно подгрузка шейдера в opengl).
вот просто из интереса, заморачиваюсь как добиться максимальной скорости и качества считывания))
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:29     Поблочное чтение из файла #4
Razzeeyy, что вы понимаете под качеством считывания?

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream fs( "f.txt" );
    string str_buffer;
 
//---------------------- читаем по слову -------------------------------------------------
    while( fs >> str_buffer )
        cout << str_buffer << '\n';
 
    cout << "[EOF]\n\n";
 
    fs.close();
 
//---------------------- в двоичном режиме - порционно -----------------------------------
 
    fs.open( "f.txt", ios::binary );
 
    fs.seekg( 0, ios::end );
    unsigned long long size = fs.tellg();
    fs.seekg( 0, ios::beg );
 
    cout << "Opened in binary mode.\nFile size: " << size << '\n';
 
    const size_t buffer_size = 32;//16384;
    char buffer[ buffer_size ];
    size_t result;
 
    while( fs.good() )
    {
        fs.read( buffer, buffer_size - 1 );
 
        size_t count = fs.gcount();
        buffer[ count ] = 0;
 
        cout << "Read " << count << " bytes:\n" << buffer << "\n-------------------\n";
    }
 
    cout << "[EOF]\n\n";
 
    fs.close();
 
//---------------------- в двоичном режиме - всё сразу -----------------------------------
 
    fs.open( "f.txt", ios::binary );
 
    fs.seekg( 0, ios::end );
    size = fs.tellg();
    fs.seekg( 0, ios::beg );
 
    cout << "Opened in binary mode.\nFile size: " << size << '\n';
 
    char * dyn_buffer = new char[ size + 1 ]; // выделяем столько памяти, сколько занимает файл
                                              // для больших файлов (сотни метров и больше) - ужасно
 
    fs.read( dyn_buffer, size );
    dyn_buffer[ size ] = 0;
 
    cout << "Whole file:\n" << dyn_buffer << endl;
 
    // освобождаем буфер
    delete [] dyn_buffer;
    dyn_buffer = 0;
 
    fs.close();
 
    return 0;
}
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
20.09.2011, 23:31  [ТС]     Поблочное чтение из файла #5
Цитата Сообщение от talis Посмотреть сообщение
Razzeeyy, что вы понимаете под качеством считывания?
Ну чтобы гарантированно весь читался и с переносами и пробелами)
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:33     Поблочное чтение из файла #6
Razzeeyy, если байт в байт, то вам нужен двоичный режим. А куда потом этот текст пойдёт? В функцию-обработчик шейдера? Как её зовут? Вы уверены, что она примет все переносы и табуляции, и что она не принимает просто имени файла?
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
20.09.2011, 23:43  [ТС]     Поблочное чтение из файла #7
Цитата Сообщение от talis Посмотреть сообщение
А куда потом этот текст пойдёт? В функцию-обработчик шейдера?
Сначала файл считывается в строку, потом строка конвертируется в char * строку и отдается функции компиляции шейдера на растерзание

C++
1
2
3
4
GLuint shader = glCreateShader(type);
const char* csource = shaderSource.c_str();
glShaderSource(shader,1,&csource,NULL);
glCompileShader(shader);
вроде бы функция сразу текст не принимает
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:48     Поблочное чтение из файла #8
Razzeeyy, почитайте спецификацию.

void glShaderSource( GLuint shader,
GLsizei count,
const GLchar ** string,
const GLint * length);

count
Specifies the number of elements in the
string and
length
arrays.

string
Specifies an array of pointers to strings
containing the source code to be loaded into the
shader.

length
Specifies an array of string lengths.
Ну и так далее
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
21.09.2011, 00:05  [ТС]     Поблочное чтение из файла #9
текстовый же файл, я имел ввиду, все равно не принимает =)
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:19     Поблочное чтение из файла #10
Razzeeyy, переведите документацию. В качестве третьего параметра идёт указатель на массив указателей на строки GLchar, которые содержат отдельные строки исходного файла. В качестве четвёртого параметра - указатель на массив GLint, каждый элемент которого содержит длину соответствующей строки. В качестве второго параметра - GLsizei, который определяет количество строк (или элементов в массиве строк и массиве длин, соответственно). Ну а с первым параметром вы, видимо, разобрались
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
21.09.2011, 00:20  [ТС]     Поблочное чтение из файла #11
Цитата Сообщение от talis Посмотреть сообщение
в двоичном режиме - порционно
Ацки! супер, спасибо, то что нужно

Я вот только непонял магию с обнулением
Цитата Сообщение от talis Посмотреть сообщение
size_t count = fs.gcount();
* * * * buffer[ count ] = 0;
но эксперементальным путем видно, что она не дает чтению оборваться, чуть не доходя до конца файла.
считывает всё шикарно быстро))
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:22     Поблочное чтение из файла #12
Razzeeyy, магия с обнулением - это выставление байта, после последнего считанного, в ноль. В Си-строках (как эта) признаком конца строки является нуль-терминатор, байт со значением 0. Когда, читая строку, вы натыкаетесь на 0, можете быть уверены - дальше лежит "мусор".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2011, 00:29     Поблочное чтение из файла
Еще ссылки по теме:

Чтение из файла C++
Чтение файла с несколькими знаками конца файла C++
C++ Чтение из файла

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

Или воспользуйтесь поиском по форуму:
Razzeeyy
 Аватар для Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
21.09.2011, 00:29  [ТС]     Поблочное чтение из файла #13
Но он же все равно не станет как ifstream'ы открывать файл за меня и считывать его)) Помоему это было бы нелогично для opengl поскольку затруднило бы биндинг к разным языкам...


Цитата Сообщение от talis Посмотреть сообщение
size_t count = fs.gcount();
* * * * buffer[ count ] = 0;
а что за магия с обнулением? эффект есть -- считывает до конца, но, что это делает О_о

кстати спасибо вам большое, в бинарном режиме порциональное считывание -- то что нужно))

Добавлено через 1 минуту
черт ступил, неувидел ответ, а при нажатии на кнопку правка виснет...
Yandex
Объявления
21.09.2011, 00:29     Поблочное чтение из файла
Ответ Создать тему
Опции темы

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