を実行しませんでした。保存された場所にファイルの個々のコンポーネントが表示され、その実行が2回行われました。大学のプロジェクトには問題があります。オープン用とforループ用に書かれています。CファイルプログラムはターボC++でプログラムを保存した後に
#include<stdio.h>
typedef struct
{
int select;
char lastname[25];
char firstname[25];
char address[25];
char phonenumber[25];
} addressbook;
#define ARRAYLEN 2
addressbook a[ARRAYLEN];
FILE *fp;
int main()
{
int i;
fp = fopen("addressbook.dat","a+");
for(i=0; i<ARRAYLEN ; i++)
{
printf("enter details\n");
printf("enter lastname:\n");
scanf("%s", a[i].lastname);
printf("enter firstname:\n");
scanf("%s", a[i].firstname);
printf("enter address:\n");
scanf("%s", a[i].address);
printf("enter phone number:\n");
scanf("%s", a[i].phonenumber);
fwrite(&a[i], sizeof(a), 1, fp); /* notice, array indexed */
}
fclose(fp);
fopen("addressbook.dat", "r");
for(i=0; i<ARRAYLEN; i++)
{
fread(&a[i], sizeof(a), 1, fp);
printf("lastname:%s\n", a[i].lastname);
printf("firstname:%s\n", a[i].firstname);
printf("address:%s\n", a[i].address);
printf("phonenumber:%s\n", a[i].phonenumber);
}
fclose(fp);
return 0;
}
に1秒間に2回 'はfopen dがそれは言うまでもない変数
に与えられた許可のスペースを超えない、値がユーザーから受け取ったことを確認していますが、fcloseを(FP)を使用しています'は戻り値を使用しません。 'fp = fopen(" addressbook.dat "、" r ");'また、 'fp'をチェックしてNULLであるかどうかを確認し、そうであれば適切な処置をとるべきです。 –
@RishikeshRaje回答として投稿してください。それは正しい解決策です。これを追加すると、閉じた 'fp'で' fread'に[UB](https://en.wikipedia.org/wiki/Undefined_behavior)が追加されます。 – LPs
トピック外のコメント...ユーザー入力を読み取るために 'scanf()'を使用することは非常に悪いことです。次のことを考慮してください。1)フィールドサイズを超える名前/住所をユーザーが入力するとどうなりますか? 2)ユーザーが複数のトークンを入力すると(複数のファーストネームが存在し、アドレスまたは電話番号のいずれかがスペースを含む*慣習的に*フォーマットされている)、どうなりますか? - 良い選択肢は、入力全体を読み込み( 'fgets()'を使用し、行全体を取得できなかった場合はバッファのサイズを変更する)、入力の量を確認し、メモリを動的に割り当て、入力バッファ – DevSolar