これは私のa.txt
ファイルで、合計3行です。余分なスペースや印刷できない文字は含まれません。
David Joans
018976
David12
これはC
このファイルを読み取るために使用するコードです。このコードを読むためにその中に構造を作成しました。パスワード::
#include<stdio.h>
#include<stdlib.h>
#pragma pack(1)
typedef struct info {
char name[15];
int num;
char pass[15];
}info;
int main(int argc, char const* argv[])
{
FILE* fp = NULL;
if (fp = fopen("a.txt", "r")) {
info var;
fread(&var, 1, sizeof(var), fp);
printf("%s\n%d\n%s\n", var.name, var.num, var.pass);
}
else {
perror("File can not be opened!!\n");
exit(EXIT_FAILURE);
}
return 0;
}
出力は次のとおりです。
David Joans
018976
David12
171325241
David12
プログラムの実際の問題は何ですか?私が理解するのを手伝ってください。
ベストアンサー1
ファイルのバイナリ表現は構造体の実際のバイナリ表現と一致する必要はありませんinfo
。コンパイラは、構造体フィールド間にパディングスペースを自由に使用できます。したがって、目的の操作を実行する唯一の信頼できる方法は、ファイル内の各フィールドを個別に読み取り、構造内の対応するフィールドに割り当てることです。このような:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma pack(1)
typedef struct info {
char name[15];
int num;
char pass[15];
}info;
int main(int argc, char const* argv[])
{
FILE* fp = NULL;
if (fp = fopen("a.txt", "r")) {
info var;
char num_str[15];
char *endl_ptr;
fgets (var.name, sizeof (var.name), fp);
fgets (num_str, sizeof (num_str), fp);
fgets (var.pass, sizeof (var.pass), fp);
/* parse num_str into an integer */
var.num = strtol(num_str, NULL, 10);
/* replace the trailing endline character by a NULL */
if ((endl_ptr = strchr (var.name, '\n')))
*endl_ptr = '\0';
if ((endl_ptr = strchr (var.pass, '\n')))
*endl_ptr = '\0';
printf("%s\n%d\n%s\n", var.name, var.num, var.pass);
}
else {
perror("File can not be opened!!\n");
exit(EXIT_FAILURE);
}
return 0;
}
あるいは、実際のバイナリ表現が構造のバイナリ表現と一致するファイルがある場合もあります。たとえば、info
すでに構造化されたプログラムでファイルが生成されている場合、単純な構造ファイルはトリックをwrite
実行します。ただし、これは他のシステムに移植することはできません。