私は次の構造体を持っています
struct
{
char order;
int row;
int column;
int length;
char printChar;
}record;
私のファイルはこんな感じです
F
30
40
7
X
freadを使用してファイルを構造体に保存するにはどうすればよいですか?ファイルは正しく表示されますか、それともすべてのコンポーネントを1行にする必要がありますか?
私の理解が正しければ、あなたはできるかどうか尋ねています。
struct record r;
fread(file, &r, sizeof(r));
または使用を余儀なくされていますか
struct record r;
fread(file, &r.order, sizeof(r.order));
これがあなたの質問である場合、答えは次のとおりです。構造体メンバー間にパディングがある可能性があるため、フィールドを 1 つずつ読み取る必要があります。または、GNU 互換コンパイラを使用している場合は、構造体を「packed」と宣言して、パディングを含めないように指示することができます。
struct record {
// ...
} __attribute__((packed));
しかし、絶対に必要でない限り、これはお勧めできません (移植性がありません)。
また、ファイルは本当にバイナリ ファイルですか? そうでない場合は、改行文字に注意し、数値をテキストから実際の数値に変換する必要があります。
その形式のファイル (基本的にデータの文字表現を含む) から構造体に読み込むことはできません。それを読み取る 1 つの方法は、各行を使用して読み取り、データを構造体に割り当てることです (必要に応じてstrtolfgets
などの関数を使用して数値を変換するか、エラー チェックがそれほど重要でない場合はおそらくatoiを使用します)。
あなたのファイルはテキストファイルのようです。それがファイルの形式とまったく同じである場合は、次を使用できますfscanf
。
fscanf(file, "%c%d%d%d%c", &(record.order), &(record.row), ...
基本的なエラー処理に興味がある場合は、戻り値を確認できます。エラーの詳細な説明が必要な場合は、 を使用fgets
して一度に 1 行ずつ読み取りsscanf
、 、atoi
、strtol
および同様の関数で解析してください。
構造体にデータを直接保存したい場合、いいえ、(そのようなファイルでは) できません。テキスト ファイル30
では、バイナリ形式の整数ではなく、2 文字の文字列です。