从visual c ++中的二进制文件中读取tails字节

时间:2015-09-23 08:27:09

标签: c++ visual-c++

这是我的尝试:

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <iostream>
#include <string>

//  Forward declarations:
void append(LPCTSTR, LPCVOID, DWORD);
void readTail(LPCTSTR, LPVOID, DWORD);


int main()
{
    LPCTSTR fn = L"C:/kaiyin/kybig.out";
    LPCVOID buf = "eeeee"; 
    append(fn, buf, 5);
    LPVOID buf1 = ""; 
    readTail(fn, buf1, 5);
    std::cout << (char*) buf1 << std::endl;


    printf("hello world\n");
    std::string s = "";
    std::getline(std::cin, s);
    return 0;
}

void append(LPCTSTR filename, LPCVOID buf, DWORD writeSize) {
    LARGE_INTEGER size;
    size.QuadPart = 0;
    HANDLE fh = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    GetFileSizeEx(fh, &size);
    SetFilePointerEx(fh, size, NULL, FILE_BEGIN);
    WriteFile(fh, buf, writeSize, NULL, NULL);
    CloseHandle(fh);
}

void readTail(LPCTSTR filename, LPVOID buf, DWORD readSize) {
    LARGE_INTEGER size;
    size.QuadPart = 0;
    HANDLE fh = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    GetFileSizeEx(fh, &size);
    size.QuadPart -= readSize;
    SetFilePointerEx(fh, size, NULL, FILE_BEGIN);
    ReadFile(fh, buf, readSize, NULL, NULL);
    CloseHandle(fh);
}

append函数似乎会将文件大小增加正确的数字(5个字节),但是在控制台中打印最后5个字节并不会显示任何内容。 出了什么问题?

2 个答案:

答案 0 :(得分:1)

您尚未为结果分配缓冲区:

LPVOID buf1 = ""; 
readTail(fn, buf1, 5);

buf1只是一个指向空字符串的指针,你想要的是一些缓冲区,把你的结果放在哪里:

BYTE buf1[10] = { 0 };
readTail(fn, buf1, 5);

此外,您将initialy附加到现有文件(由于OPEN_EXISTING),因此您可以使用空的C:/kaiyin/kybig.out文件。

答案 1 :(得分:0)

仅供记录,以下是根据@marcinj的建议修改后的代码:

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <iostream>
#include <string>

//  Forward declarations:
void append(LPCTSTR, LPCVOID, DWORD);
void readTail(LPCTSTR, LPVOID, DWORD);
void truncateTail(LPCTSTR, long);


int main()
{
    LPCTSTR fn = L"C:/kaiyin/kybig.out";
    char buf[] = "helloWorld"; 
    append(fn, buf, 10);
    BYTE buf1[10] = {0};
    readTail(fn, buf1, 5);
    std::cout << (char*) buf1 << std::endl;
    truncateTail(fn, 5);
    for (int i = 0; i < 10; i++) {
        buf1[i] = 0;
    }
    readTail(fn, buf1, 5);
    std::cout << (char*) buf1 << std::endl;

    printf("End of program\n");
    std::string s = "";
    std::getline(std::cin, s);
    return 0;
}

void append(LPCTSTR filename, LPCVOID buf, DWORD writeSize) {
    LARGE_INTEGER size;
    size.QuadPart = 0;
    HANDLE fh = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    GetFileSizeEx(fh, &size);
    SetFilePointerEx(fh, size, NULL, FILE_BEGIN);
    WriteFile(fh, buf, writeSize, NULL, NULL);
    CloseHandle(fh);
}

void readTail(LPCTSTR filename, LPVOID buf, DWORD readSize) {
    LARGE_INTEGER size;
    size.QuadPart = 0;
    HANDLE fh = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    GetFileSizeEx(fh, &size);
    size.QuadPart -= readSize;
    SetFilePointerEx(fh, size, NULL, FILE_BEGIN);
    ReadFile(fh, buf, readSize, NULL, NULL);
    CloseHandle(fh);
}

void truncateTail(LPCTSTR filename, long truncateSize) {
    LARGE_INTEGER size;
    size.QuadPart = 0;
    HANDLE fh = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (fh == INVALID_HANDLE_VALUE) {
        std::cerr << GetLastError();
        return;
    }
    GetFileSizeEx(fh, &size);
    size.QuadPart -= truncateSize;
    SetFilePointerEx(fh, size, NULL, FILE_BEGIN); 
    if (SetEndOfFile(fh) == 0) {
        std::cerr << GetLastError();
        return;
    }
    CloseHandle(fh);
}