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
。
您还可能希望在读取文件时在打印的值上有前导零(就像您最初打印扫描数据时已经拥有的那样)。
我有以下代码,其中我尝试在第一次执行时将一些数据写入文件,然后在第二次执行时读取文件并将数据打印到屏幕。
在第一次执行时,它会将数据完全按照代码 (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
。
您还可能希望在读取文件时在打印的值上有前导零(就像您最初打印扫描数据时已经拥有的那样)。