Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ReadFile 
:(
    Опции темы
YahоО
Дата 7.5.2021, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 11.6.2015

Репутация: нет
Всего: 1



Код

#include <windows.h>
#include <stdio.h>
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
int main(){
    const char name[] = "counter.dat";
    char Str[] = "Example text testing WriteFile1\nExample text testing WriteFile2\nExample text testing WriteFile3\nExample text testing WriteFile4\nExample text testing WriteFile5\nExample text testing WriteFile6\nExample text testing WriteFile7\nExample text testing WriteFile8\nExample text testing WriteFile9\nExample text testing WriteFile10\nExample text testing WriteFile11\nExample text testing WriteFile12\nExample text testing WriteFile13\nExample text testing WriteFile14\nExample text testing WriteFile15\nExample text testing WriteFile16\nExample text testing WriteFile17\nExample text testing WriteFile18\nExample text testing WriteFileFINISH19\n";
    HANDLE hFile = CreateFile(name, GENERIC_WRITE, 0, NULL,    CREATE_ALWAYS, NULL, NULL);
    if (INVALID_HANDLE_VALUE == hFile)    return 1;
    else {
        DWORD dwBytesWritten = 0;
        WriteFile(hFile, Str, strlen(Str), &dwBytesWritten, NULL);
        CloseHandle(hFile);
        cout <<"Create file: "<<name <<" "<< dwBytesWritten << " b\n";
    }
    Sleep(100);
    DWORD R, Size=255, R2=0;
    char Line[256];
    hFile = CreateFileA(name, GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if (hFile == INVALID_HANDLE_VALUE)    return 1;
    while( ReadFile(hFile, Line, Size, &R, NULL) !=0 ){
        R2+=R;
        cout<< Line <<" ::: "<< R<< " ::: "<< R2<< "\n---****---\n";
        if(R == 0 ) break;
        else         cout<< "\n====\n";
    }
    CloseHandle(hFile);
    system("pause");
    ExitProcess(0);
}

Создает файл в несколько строк, и пробует его прочитать, и сразу же напечатать в консоли.
Файл создает хорошо.
Файл читает.
Но в консоли пишет всякую ересь, все невпопад печатает, и кроме того имеются повторы считанного и уже ранее напечатанного в консоли текста.
При этом количество считанных байт совпадает с размером файла, и весь текст в общем то в напечатанном имеется, но результат все же  неверный.
Асинхронность, или жадный поиск, в смысле жадное чтение? или выборочное избирательное перечитывание уже прочтенного файла, не понятно как это вообще такое может быть.
Можно ли так подправить код чтобы он сам свои же ошибки и показывал? а то ведь в данном коде чтение завершено типа успешно.
И самый вопрос - ReadFile именно так и должен читать файл с диска?


PM MAIL   Вверх
Aa1
Дата 8.5.2021, 04:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.11.2012

Репутация: 1
Всего: 1



Перед выводом в консоль добавьте
Код

Line[R]=0;

PM MAIL   Вверх
YahоО
Дата 8.5.2021, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 11.6.2015

Репутация: нет
Всего: 1



Великолепно! Коротко, и лечит капитально, и все работает. Но не понятно!!!

--1-
lpBuffer он же Line, так ведь же:
vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_readfile.htm
"Доступ к буферу ввода, в то время как операция чтения использует этот буфер, может привести к искажению прочитанных данных в буфер. Приложения не должны читать из, записывать в, перераспределять или освобождать буфер ввода, который использует операция чтения  до тех пор, пока она не завершится."   ???
--2-
BOOL ReadFile(
  HANDLE hFile,                // дескриптор файла
  LPVOID lpBuffer,             // буфер данных
  DWORD nNumberOfBytesToRead,  // число байтов для чтения
  LPDWORD lpNumberOfBytesRead, // число прочитанных байтов
  LPOVERLAPPED lpOverlapped       // асинхронный буфер
);
Так есть же Size, отвечающий за финиш, и он же наверно и должен подсчитывать количество прочитанных символов, и заканчивать свое чтение файла в нужной точке,
следовательно проблема по всей видимости в Size, и я подумал что нужно как то экспериментировать с размером Size, добавив DWORD Size0 = GetFileSize(hFile, &Size0);
и по мере чтения файла уменьшать его на количество прочитанных символов, с тем чтобы читать только оставшееся количество символов, т.е. пока Size больше 0. Но это как то не сработало.
--3-
И формула есть, в смысле функция имеется, и что то в ней не ясно, не очевидно, не понятно, значит это магия, и соответственно  Line[R]=0; тоже магия smile
--4-
Значит надо изучить еще и "Типы данных Windows". Aa1, спасибо!
PM MAIL   Вверх
YahоО
Дата 8.5.2021, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 11.6.2015

Репутация: нет
Всего: 1



Line[R]='\0';  // если так, то как бы понятнее )) Но! Почему умный компилятор и умный С++ этого не делают сами? Неужели им самим это невдомек? (ну их же аж двое!)
---
Разве возможны варианты использования функции ReadFile в том виде как она сейчас есть, т.е. без доработок Line[R]=... 
типа догадайся сам, что после их работы нужно еще какие то коррективы вносить чтобы мусор отделить от плевел, и чтобы все цвело и пахло? ущербная магия требует доработки человеком?
Доверяй, но проверяй! )))))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1078 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.