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

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

Войти
Регистрация
Восстановить пароль
 
Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
#1

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

20.09.2011, 23:09. Просмотров 1020. Ответов 12
Метки нет (Все метки)

Здравствуйте, балуюсь с чтением из файла.
Так вот если читать посимвольно всё в порядке, но больно долго.
А если хитро "буферизированно" читать методом 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++
Нашел-таки ошибки в своём коде шифрования DES, исправил. Теперь надо реализовать работу с файлом. Как бинарно считывать блоками по 8 байт...

Переделать в коде чтение из файла в чтение с клавиатуры - C++
Переделайте что бы текст считывался с клавиатуры, а не с файла! Буду благодарен за помощь! //файл должен начинаться со слова, между...

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

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt; #include &lt;cstdlib&gt; using namespace std; struct...

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

как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла? - C++
Друзья! Создадим два текстовых файла, f_0.txt и f_1.txt и что-нибудь в них запизаем, например в первый запихаем 1234 а во второй 5678 и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:17 #2
Razzeeyy, а что вы хотите сделать с файлом? Просто вывести на экран? Выводите по мере чтения тогда. Если файл текстовый - то читайте в текстовом режиме, например, по словам. Если файл бинарный - то читайте порционно.
Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
20.09.2011, 23:23  [ТС] #3
Цитата Сообщение от talis Посмотреть сообщение
Razzeeyy, а что вы хотите сделать с файлом? Просто вывести на экран? Выводите по мере чтения тогда. Если файл текстовый - то читайте в текстовом режиме, например, по словам. Если файл бинарный - то читайте порционно.
Есть надобность читать текстовый файл и загонять в строку (если конкретно подгрузка шейдера в opengl).
вот просто из интереса, заморачиваюсь как добиться максимальной скорости и качества считывания))
talis
791 / 543 / 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
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
20.09.2011, 23:31  [ТС] #5
Цитата Сообщение от talis Посмотреть сообщение
Razzeeyy, что вы понимаете под качеством считывания?
Ну чтобы гарантированно весь читался и с переносами и пробелами)
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 23:33 #6
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
791 / 543 / 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
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
21.09.2011, 00:05  [ТС] #9
текстовый же файл, я имел ввиду, все равно не принимает =)
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:19 #10
Razzeeyy, переведите документацию. В качестве третьего параметра идёт указатель на массив указателей на строки GLchar, которые содержат отдельные строки исходного файла. В качестве четвёртого параметра - указатель на массив GLint, каждый элемент которого содержит длину соответствующей строки. В качестве второго параметра - GLsizei, который определяет количество строк (или элементов в массиве строк и массиве длин, соответственно). Ну а с первым параметром вы, видимо, разобрались
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
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.09.2011, 00:22 #12
Razzeeyy, магия с обнулением - это выставление байта, после последнего считанного, в ноль. В Си-строках (как эта) признаком конца строки является нуль-терминатор, байт со значением 0. Когда, читая строку, вы натыкаетесь на 0, можете быть уверены - дальше лежит "мусор".
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 минуту
черт ступил, неувидел ответ, а при нажатии на кнопку правка виснет...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2011, 00:29
Привет! Вот еще темы с ответами:

Чтение файла с несколькими знаками конца файла - C++
В файле несколько раз встречается ноль, и ни как не получается прочитать его полностью. Как можно решить данную проблему ?

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

Чтение из файла - C++
Всем привет! чёт я не могу разобраться! есть файл 1.txt с содержимым: 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 ...

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


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

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

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