私はこの割り当てに取り組んでいます。そこでは、「レコード」を読み込んでファイルに書き込み、後でそれらを読み取ったり見つけたりする必要があります。プログラムを実行するたびに、ユーザーは新しいレコードを書き込むか、古いレコードを読み取るか(名前または#のいずれかで)を決定できます。
ファイルはバイナリです。その定義は次のとおりです。
typedef struct{
char * name;
char * address;
short addressLength, nameLength;
int phoneNumber;
}employeeRecord;
employeeRecord record;
プログラムの動作方法では、構造、名前、アドレスの順に格納されます。名前とアドレスは動的に割り当てられるため、最初に構造を読み取って名前とアドレスのサイズを見つけ、それらにメモリを割り当ててから、そのメモリに読み込む必要があります。
デバッグの目的で、現在2つのプログラムがあります。私は自分のファイル書き込みプログラムとファイル読み取りを持っています。
私の実際の問題はこれです。私が書いたファイルを読むとき、私は構造を読み、電話番号を印刷してそれが機能することを確認し(これは正常に機能します)、次に名前を読みます(これでレコードを使用できるようになります)。適切な値も報告するnameLength)。ただし、Freadは使用可能な名前を返さず、空白を返します。
ファイルに名前を正しく書き込んでいないか、正しく読み取っていないという2つの問題があります。これが私がファイルに書き込む方法です:ここでfpはファイルポインタです。record.nameは適切な値であるため、record.nameLengthも適切な値です。また、ヌルターミネータを含む名前を書いています。(例:'Jack \ 0')
fwrite(&record,sizeof record,1,fp);
fwrite(record.name,sizeof(char),record.nameLength,fp);
fwrite(record.address,sizeof(char),record.addressLength,fp);
そして、ファイルを閉じます。これが私がファイルを読む方法です:
fp = fopen("employeeRecord","r");
fread(&record,sizeof record,1,fp);
printf("Number: %d\n",record.phoneNumber);
char *nameString = malloc(sizeof(char)*record.nameLength);
printf("\nName Length: %d",record.nameLength);
fread(nameString,sizeof(char),record.nameLength,fp);
printf("\nName: %s",nameString);
そこにいくつかのデバッグ機能があることに注意してください(名前の長さと数、どちらも正しい)。だから私はファイルが正しく開かれたことを知っています、そして私は名前の長さをうまく使うことができます。それでは、なぜ私の出力が空白、改行、またはそのようなものなのですか?(出力は名前だけです:その後は何もありません、そしてプログラムはうまく終了します)
助けてくれてありがとう。