用C进行二进制读取和写入文件

时间:2015-10-08 23:45:41

标签: c binary

我需要一些帮助,用C编写程序来读取和写入文件中的二进制值。对于这个程序,我不需要读入文件的全部内容(2048字节),只需要前30个半字。

我知道如何编写程序来为文本文件执行此操作,但我是二元文件的新手。我是否需要为文本文件分配内存?使用缓冲区会有帮助吗?命令是否与fprintf,sscanf和其他语法相似或不同?

1 个答案:

答案 0 :(得分:2)

此示例应该有效

#define FILE "file path"
#define LEN 30
int main()
{
    int read;
    char *buffer;
    HANDLE hFile = CreateFile(FILE, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 
                              FILE_ATTRIBUTE_NORMAL, NULL);
    if(hFile == INVALID_HANDLE_VALUE){
        printf("[-] CreateFile() failed.\n");
        return 0;}
    buffer = (char*)malloc(LEN);
    ReadFile(hFile, buffer, LEN, &read, NULL);
}

您读取的文件没有特殊标志。你提到你只需要前30个半字,这显然是前30个字节。 ReadFile()具有nNumberOfBytesToRead参数,因此您只需要传递30个。如果您需要,可以尝试读取.exe文件并打印所获得的内容。它应该从MZ和&#34开始;这个程序不能在dos模式下运行" (你需要读取超过30个字节才能看到所有内容)。一些NULL字节不会让你只是打印它,所以你应该尝试这种方式

int PrintBuffer(char *buffer)
{
    int written;
    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
    WriteFile(out, buffer, LEN, &written, NULL);
    CloseHandle(out);
}

编辑:没有winapi的版本

#define PATH "file path"
#define LEN 30
#define HWORD 1
int main()
{
    int i = 0;
    char *buffer = (char*)malloc(LEN);
    FILE *f = fopen(PATH, "rb");

    if(!f) printf("[-] fopen() failed.\n");
    else printf("[+] fopen() succeeded.\n");

    if(fread(buffer, HWORD, LEN, f) != LEN) printf("[-] fread() failed.\n");
    else printf("[+] fread() succeeded.\n");

现在打印数据而没有NULL字节太早切断输出

    for(i = 0; i < LEN; i++) printf("%c", buffer[i]);
}

fread()读取&#34;元素&#34;从文件中有以下参数:
1.将接收读数据的缓冲区 2.每个元素的大小(以字节为单位)。半字是一个字节,因此大小为1 3.您要阅读的元素数量。在这种情况下30。 4.您用于fopen()的文件*。

返回值是成功读取的元素数量,应为30。