«Функция ReadFile» Есть ли способ, которым я больше не могу объявить определенное количество байтов для чтения? - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь сделать программу, используя Windows API в C ++ Цель состоит в том, чтобы прочитать содержимое текстового файла, который я создал, и который может манипулировать содержимым с помощью побитового XOR (изменение в нижний и верхний регистры, и наоборот), а затем снова поместить содержимое в текстовый файл. Вот поток программы, которую я использовал:

  1. Открыть текстовый файл с помощью CreateFile.
  2. Поместить содержимое текстового файла в созданный malloc.
  3. Управление содержимым текстового файла с использованием побитового XOR (xor = 20).
  4. Затем снова поместите значение xor в текстовый файл.

Вот код:

#include "pch.h"
#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
    HANDLE openFile;
    HANDLE ovewriFile;
    BOOL readwriFile;
    DWORD dwNoByteRead = 0;
    DWORD dwNoByteWritten = 0;
    char *strVal;
    //allocate memory
    strVal = (char*)malloc(sizeof(strVal));
    memset(strVal, '0x00', sizeof(strVal));

    //open a file
    openFile = CreateFile(L"C:\\Users\\John.Doe\\Documents\\test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    //reading the content
    readwriFile = ReadFile(openFile, strVal, 34, &dwNoByteRead, NULL);
    cout << "original content is " << strVal << endl;

    CloseHandle(openFile);

    //manipulate data using xor
    for (int i = 0; i != strlen(strVal); i++) {
        if (strVal[i] == 0x20)
        {
            continue;
        }
        strVal[i] ^= 0x20;
    }
    cout << "xor value: " << strVal << endl;

    //overwrite a file
    ovewriFile = CreateFile(L"C:\\Users\\farrel.moje\\Documents\\test.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    //write the content
    readwriFile = WriteFile(ovewriFile, strVal, 34, &dwNoByteWritten, NULL);

    //just a way to know if successful yung writefile
    if (readwriFile == FALSE) {

        cout << "ERROR WRITING " << GetLastError() << endl;
    }
    else {
        cout << "Success Overwrite " << endl;
    }
    cout << "Modified content " << strVal << endl;

    CloseHandle(ovewriFile);
    free(strVal);

    return 0;
}

Эта программа работает, но когда я попытался изменить nNumberOfBytesToRead (максимальное число байтов для чтения) с 34 на sizeof (strVal) или strlen (strVal)

readwriFile = ReadFile (openFile, strVal, 34, & dwNoByteRead, NULL);

, но используя sizeof и strlen, он не отображал полное содержание текстового файла. Есть ли способ, которым я больше не могу объявить определенное количество байтов для чтения?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Убери свой

strVal = (char*)malloc(sizeof(strVal));
memset(strVal, '0x00', sizeof(strVal));

потому что это плохая идея.

Измените некоторый код, чтобы получить размер вашего файла:

openFile = CreateFile(L"C:\\Users\\John.Doe\\Documents\\test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

LARGE_INTEGER fs;
GetFileSizeEx(openFile, &fs);
unsigned long long fSize = fs.QuadPart;
strVal = new char[fSize+1];
memset(strVal, 0, fSize+1);

//reading the content
readwriFile = ReadFile(openFile, strVal, fSize, &dwNoByteRead, NULL)

И в конце не забудьте

delete []strVal;

вместо вашего бесплатно (strVal)

0 голосов
/ 14 ноября 2018

Вы можете использовать API GetFileSizeEx (), чтобы сначала получить размер файла.Кроме того, sizeof (точка) всегда возвращает 4/8, потому что это размер этой точки, но не размер, который вы хотите выделить.Добавьте и измените свой код, как показано ниже:

LARGE_INTEGER liFileSize;
//open a file
openFile = CreateFile(L"C:\\Users\\John.Doe\\Documents\\test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
GetFileSizeEx(openFile, &liFileSize);
//allocate memory
strVal = (char*)malloc(liFileSize.QuadPart);
memset(strVal, 0, liFileSize.QuadPart);

Затем вы можете использовать "liFileSize.QuadPart" для замены "nNumberOfBytesToRead" (34)

...