我一直在处理本书中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;
}
答案 0 :(得分:4)
看起来所有内容都已正确保存。但是你在这里打印指针而不是值:
printf( "%-6d%-16s%-11s%10.2f\n", &client.account, client.lastname, client.name, &client.balance );
它应该是这样吗?
printf( "%-6d%-16s%-11s%10.2f\n", client.account, client.lastname, client.name, client.balance );
答案 1 :(得分:1)
文件阅读器中的这一行是错误的:
printf( "%-6d%-16s%-11s%10.2f\n", &client.account, client.lastname, client.name, &client.balance );
目前,您正在打印帐户的地址(指针)和余额变量,而不是这些变量的值。
应该是:
printf( "%-6d%-16s%-11s%10.2f\n", client.account, client.lastname, client.name, client.balance );
有用提示:我通过启用编译器警告发现了此错误。 gcc
输出了这些警告:
reader.c:26:28: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat]
reader.c:26:28: warning: format '%f' expects argument of type 'double', but argument 5 has type 'double *' [-Wformat]
了解如何在编译器/ IDE中启用这些警告是一个非常好的主意,因为它们可以为您节省大量的时间来解决这些问题。