バイナリファイルからデータを読み取る必要があるプロジェクトに取り組んでいます。データをcharバッファに保存しようとしています。バイナリファイルが文字、int、およびdoubleで構成されているとすると、charバッファはどのサイズにする必要がありますか?そして、どうすればintとdoubleに戻すことができますか?
プログラムの速度が向上するため、データをcharバッファに読み込んでいます。
ありがとう!
バイナリファイルからデータを読み取る必要があるプロジェクトに取り組んでいます。データをcharバッファに保存しようとしています。バイナリファイルが文字、int、およびdoubleで構成されているとすると、charバッファはどのサイズにする必要がありますか?そして、どうすればintとdoubleに戻すことができますか?
プログラムの速度が向上するため、データをcharバッファに読み込んでいます。
ありがとう!
fscanf関数を使用して、ファイルから熱心に待機している変数にデータを直接読み取ることができます。
char c;
int i;
double d;
FILE *fp = fopen("C:\\example.txt", "rb");
if (fp)
{
fscanf(fp, "%c%d%lf", &c, &i, &d);
fclose(fp);
printf("Character: %c\nInteger: %d\nDouble: %lf\n", c, i, d);
}
編集:についての詳細をお探しの場合は、ここfscanf
を参照してくださいEDIT2
:
FILE *fp = fopen("C:\\example.txt", "rb");
if (fp)
{
char buffer[sizeof(int) + sizeof(double) + sizeof(char)];
if (fread(buffer, 1, sizeof(buffer), fp) == sizeof(buffer))
{
char c = *(char*)buffer;
int i = *(int*)(buffer + sizeof(char));
double d = *(double*)(buffer + sizeof(char) + sizeof(int));
}
fclose(fp);
}
次のサンプルプログラムは、コマンドラインで指定されたファイルのa 、an、およびafread()
の最初のDATASIZE
セットです。char
int
float
typedef struct Data_s {
char c;
int i;
float f;
} Data_t;
#define DATASIZE 3
int main(int argc, char ** argv) {
if (1 >= argc) {
fprintf(stderr, "usage: %s <file name>\n", argv[0]);
return EXIT_SUCCESS;
}
{
FILE * f = fopen(argv[1], "r");
if (!f) {
perror("fopen() failed.");
return EXIT_FAILURE;
}
{
Data_t data[DATASIZE];
size_t sizeData = sizeof(*data);
size_t sizeToRead = sizeof(data)/sizeData;
memset(data, 0, sizeToRead * sizeData);
size_t sizeRead = fread(&data, sizeData, sizeToRead, f);
if (0 != fclose(f))
perror("fclose() failed,");
if (sizeToRead != sizeRead) {
perror("fread() failed.");
return EXIT_FAILURE;
}
for (size_t i = 0; i < sizeToRead; ++ i)
printf("read c=0x%02hhx, i=%d, f=%f from '%s'\n", data[i].c, data[i].i, data[i].f, argv[1]);
}
}
return EXIT_SUCCESS;
}