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

Максимально эфективное бинарное чтение из файла под Windows - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Заполнение матрицы по правилу http://www.cyberforum.ru/cpp-beginners/thread731192.html
Привет, делаю лабораторную, нужно заполнить матрицу по заданному правилу: 19 20 21 22 23 24 18 17 16 15 14 13 7 8 9 10 11 12 6 5 4 3 2 1 Размер матрицы ввожу сама, вот мой код: #include <iostream>
C++ Переписать в другой файл все положительные элементы первого файла, стоящие на четных местах Люди добрые, помогите пожалуйста: необходимо создать файл, состоящий из целых чисел. Переписать в другой файл все положительные элементы первого файла, стоящие на четных местах. Оба файла вывести в консоль. Собственно, вопрос знатокам: как произвести запись массива в файл и его дальнейшее считывание? Заранее спасибо за помощь :D http://www.cyberforum.ru/cpp-beginners/thread731189.html
Метод Касательных C++
Задание: Решение нелинейных алгебраических уравнений методом касательных. Помогите найти ошибку в коде программы : #include <math.h> #include <conio.h> #include <stdio.h> float fx(float); float fx1(float); void main() { clrscr();
строки (напечатать все слова,которые совпадают с начальным отрезком латинского алфавита C++
строки (напечатать все слова,которые совпадают с начальным отрезком латинского алфавита) Ребята,нужна помощь!!) Дана строка,которая состоит из слов, разделенных пробелами. Нужно напечатать все слова,которые совпадают с начальным отрезком латинского алфавита (a, ab, abc,abcd … и т. д)
C++ запись строки в файл http://www.cyberforum.ru/cpp-beginners/thread731157.html
Помогите, пожалуйста, программа должна записывать строку в файл, но только с помощью gets() и puts() #include <iostream> #include <cstdio> using namespace std; int main() { FILE * ptrFile = fopen("text.txt", "w"); if (ptrFile != NULL) {
C++ Быстродействие процессора? Ребят заинтересовал вопрос по архитектуре процессора. Что мешает повысить быстродействие процессора за счет увеличения количества конвейеров? подробнее

Показать сообщение отдельно
WhiteP
605 / 203 / 23
Регистрация: 20.11.2012
Сообщений: 419
14.12.2012, 17:32     Максимально эфективное бинарное чтение из файла под Windows
Вот как-то так. Естественно, чтобы был прирост скорости - нужно избавиться от частых вызовов тормозных потоков C++ (std::cout). Тут они только для наглядности.

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
#include <iostream>
#include <windows.h>
 
#define BUFSIZE 65536 //должен быть кратен размеру сектора (обычно 512, точнее - GetDiskFreeSpace)
 
int main()
{
    //буфер должен быть выровнен по границе сектора. VirtualAlloc выравнивает начало буфера
    //автоматически по адресу кратному 64.
    BYTE * pBuf = (PBYTE)VirtualAlloc(NULL, BUFSIZE, MEM_COMMIT, PAGE_READWRITE);
 
    if(!pBuf)
    {
        std::cout<<"VirtualAlloc error. Code: "<<GetLastError()<<std::endl;
        return -1;
    }
 
    std::cout<<"Memory successfully allocated. Address: "<<(int)pBuf<<std::endl;
        
    HANDLE hFile = CreateFileW(L"c:\\input.bin", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_NO_BUFFERING, 0);
    
    if(hFile == INVALID_HANDLE_VALUE)
    {
        std::cout<<"CreateFile error. Code: "<<GetLastError()<<std::endl;
        VirtualFree(pBuf, BUFSIZE, MEM_RELEASE);
        return -1;
    }
 
    std::cout<<"File successfully opened. Start reading."<<std::endl;
 
    DWORD readed = 0, fSize = 0, step = 1;
    BOOL isOk = 0;
 
    //двигать файловый указатель можно только по границам секторов!
    while(isOk = ReadFile(hFile, pBuf, BUFSIZE, &readed, 0))
    {
        std::cout<<"Step "<<step++<<". Readed bytes: "<<readed<<std::endl;
        fSize+=readed;
        if(readed < BUFSIZE)
            break;
    }
    if(isOk == FALSE)
        std::cout<<GetLastError()<<std::endl;
 
    std::cout<<" Total readed bytes: "<<fSize<<". FileSize is "<<GetFileSize(hFile, 0)<<std::endl;  
 
    CloseHandle(hFile);
    VirtualFree(pBuf, BUFSIZE, MEM_RELEASE);
 
    return 0;
}
 
Текущее время: 02:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru