3

我一直在处理本书中的 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;
}
4

2 回答 2

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 );
于 2012-11-13T22:05:02.287 回答
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 中启用这些警告将是一个非常好的主意,因为它们将为您节省大量时间来解决这些问题。

于 2012-11-13T22:05:11.630 回答