我一直在处理本书中的 3 个程序的问题:C How to Program - Deitel它们与我学习方法中的第 11 章管理文件(顺序和随机访问文件)有关 我喜欢在开始之前测试示例程序练习,我无法完成随机访问文件的 3 个示例(创建、读取和写入)我有三个意想不到的行为。让我展示:
首先我运行随机访问文件创建器,没有什么奇怪的,我得到了完成消息。
其次我编译写随机访问值文件,然后输入值,没有什么奇怪的。
第三,我想使用野兔策略并使用记事本读取 .dat 文件,以查看数据是否正确保存。令人惊讶的是,显示了一些垃圾。而且我想得很好,也许双重表示与阅读程序(记事本)不匹配。所以我进入了第四步。
第四,我编译了读取随机存取文件程序。令人惊讶的是,显示的数据不是我输入的。
我不想在这里发布这个问题,因为我知道还有更重要的问题,更有趣但我找不到我做错了什么,我一直在寻找一段时间,我终于决定问专家。我在下面留给你 SC(谢谢!):
/*To create the file*/
#include <stdio.h>
struct clientsData{
int account;
char lastname[ 30 ], name[ 30 ];
double balance;
};
int main(void)
{
int i;
struct clientsData client = { 0, "", "", 0.0 };
FILE *cfPtr;
if( ( cfPtr = fopen( "clients.dat", "wb" ) ) == NULL ) {
printf( "File couldn't be opened. " );
}
else{
printf( "Generating\n" );
for ( i = 1; i <= 10000; i++ ){
printf( "-" );
fwrite( &client, sizeof( struct clientsData ), 1, cfPtr );
}
fclose( cfPtr );
}
printf( "\nFile succesfully created\n" );
return 0;
}
/* To write the file */
#include <stdio.h>
struct clientsData{
int account;
char lastname[ 30 ], name[ 30 ];
double balance;
};
int main(void)
{
FILE *cfPtr;
struct clientsData client = { 0, "", "", 0.0 };
if( ( cfPtr = fopen( "clients.dat", "rb+" ) ) == NULL ) {
printf( "File couldn't be opened. " );
}
else{
printf( "Enter account number"" ( 1 to 10000, 0 to end the input )\n?" );
scanf( "%d", &client.account );
while( client.account != 0 ){
printf( "Enter the lastname, firstname and the balance\n?" );
fscanf( stdin, "%s%s%lf", client.lastname, client.name, &client.balance );
fseek( cfPtr, ( client.account - 1 ) * sizeof( struct clientsData ), SEEK_SET );
fwrite( &client, sizeof( struct clientsData ), 1, cfPtr );
printf( "Enter account number\n?" );
scanf( "%d", &client.account );
}
fclose( cfPtr );
}
return 0;
}
/*To read the File*/
#include <stdio.h>
struct clientsData{
int account;
char lastname[ 30 ], name[ 30 ];
double balance;
};
int main(void)
{
FILE *cfPtr;
struct clientsData client = { 0, "", "", 0.0 };
if( ( cfPtr = fopen( "clients.dat", "rb" ) ) == NULL ) {
printf( "File couldn't be opened. " );
}
else{
printf( "%-6s%-16s%-11s%10s\n", "Acct", "Lastname", "Firstname", "Balance" );
while( !feof( cfPtr ) ){
fread( &client, sizeof( struct clientsData ), 1, cfPtr );
if( client.account != 0 ){
printf( "%-6d%-16s%-11s%10.2f\n", &client.account, client.lastname, client.name, &client.balance );
}
}
fclose( cfPtr );
}
return 0;
}