ANSI C 我在 fwrite 和 fread 上做错了什么?

ANSI C What am I doing wrong with fwrite and the fread?

我有以下代码,其中我尝试在第一次执行时将一些数据写入文件,然后在第二次执行时读取文件并将数据打印到屏幕。

在第一次执行时,它会将数据完全按照代码 (test_data) 中的方式写入屏幕,并按预期创建文件。

问题是当我读回文件并将我读到的内容写到屏幕上时,我在任何文本编辑器中看到的只是文件的纯内容,而不是原始数据。我不知道我做错了什么。

我很确定第 67 行有问题,这与我将它打印到屏幕上的方式有关,但我是 C 的新手,不习惯处理数据格式。

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

int main ()
{

    FILE * pdataFile = NULL;
    const char * datafilename = "data.bin";
    const char * _WRITE = "wb"; 
    const char * _READ  = "rb"; 
    uint8_t data[32]; 
    int idx; 
    unsigned long dataFileLen; 
    char dataBuffer;

    char test_data[] = "ahFlup1r2PWO1zySK9SBcPIQC5DcCw1mq7JrObea8lDWH&FcLbi7EzBu7ow56KbJ"; 
    char * pos = test_data;



    pdataFile = fopen(datafilename, _READ);
    if (pdataFile == NULL) {
        printf("No existing file named: %s .\n", datafilename);

        /******** Print Contents of data Array ********/
        printf("Random data: "); 

        for (idx = 0; idx < 32; ++idx) {
            sscanf(pos, "%2hhx", &data[idx]);
            pos += 2 * sizeof(char); 
            printf("%02x", data[idx]);  
        };

        printf("\n"); // new line


        /******** Save data to File ********/
        pdataFile = fopen(datafilename, _WRITE);
        if (pdataFile == NULL) {
            printf("Error opening file %s for writing. End Program\n", datafilename); 
        } else {      
            fwrite (test_data, sizeof(char), sizeof(test_data), pdataFile); 

            if (ferror (pdataFile))
                printf("Error writing file %s.", datafilename);     

            fclose (pdataFile);
        };

    } else {
        fseek(pdataFile, 0, SEEK_END);
        dataFileLen = ftell(pdataFile);
        fseek(pdataFile, 0, SEEK_SET);

        char *dataBuffer = malloc((dataFileLen+1)*sizeof(unsigned char));

        fread(dataBuffer, dataFileLen, 1, pdataFile);

        if (ferror (pdataFile))
            {
                printf("Error reading file contents: %s.", datafilename);

            }else{
            printf("data read from file: ");            
            for(idx = 0; idx<dataFileLen; ++idx){ 
                printf("%2hhx", ((char *)dataBuffer)[idx]);  
            };
        };

        printf("\n"); // new line

        fclose (pdataFile);

    };

    return 0;
}; 

更新 我期待看到以下内容: 第一次执行时 Random data: ahFlup1r2PWO1zySK9SBcPIQC5DcCw1mq7JrObea8lDWH&FcLbi7EzBu7ow56KbJ

第二次执行时 data read from file: ahFlup1r2PWO1zySK9SBcPIQC5DcCw1mq7JrObea8lDWH&FcLbi7EzBu7ow56KbJ

第二次更新 即使在这里发布了答案,我仍然得到: Seed read from file: 6168466c757031723250574f317a79534b39534263504951433544634377266d71374a724f626561286c4457482646634c626937457a4275376f7735264b624a00

该程序是在 GCC 中编译的,应该从此处的代码编译。

您可能正在将错误数组的内容写入文件。

尝试写 data 而不是 test_data

您还可能希望在读取文件时在打印的值上有前导零(就像您最初打印扫描数据时已经拥有的那样)。