在C中创建,写入和读取随机访问文件时出现意外行为

时间:2012-11-13 21:50:40

标签: c random-access

我一直在处理本书中3个程序的问题:C How to Program - Deitel它们与我在学习方法中管理文件(顺序和随机访问文件)的第11章有关我以前想测试示例程序我负责练习,我无法完成随机访问文件(创建,阅读和写入)的3个示例我有三个意外行为。让我说明一下:

  • 首先我运行随机访问文件创建器,没有什么看起来很奇怪,我得到完成消息。 enter image description here

  • 其次我编写了写随机访问值文件,然后输入值,似乎没什么奇怪的。 Entering values

  • 第三,我想使用野兔策略并使用记事本读取.dat文件,以查看数据是否已正确保存。并且惊讶地发现一些垃圾。我想,也许双重表示与阅读程序(记事本)不匹配。所以我搬到了第四步。

Reading File notepad

  • 第四,我编译了阅读随机访问文件程序。而且数据显示的并不是我输入的内容。

    results didn't match

我不想在这里发布这个问题,因为我知道有更重要的问题,而且更有趣但我找不到我做错了什么,我一直在寻找一些时间,我终于决定问专家。我给你留下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;
}

2 个答案:

答案 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中启用这些警告是一个非常好的主意,因为它们可以为您节省大量的时间来解决这些问题。