在C中写入数据库文件时出了什么问题

时间:2014-11-26 16:24:16

标签: c

我正在做家务工作。这是实际的任务:

硬件清单 - 编写数据库以跟踪工具,其成本和数量。您的程序应该将hardware.dat初始化为100个空记录,让用户输入该工具的记录号,工具名,成本和数量。您的程序应该允许您删除和编辑数据库中的记录。下一次运行程序必须从上一次会话的数据开始。

在适当地初始化hfPtr之后,我收到一个逻辑错误,它阻止程序实际更新文件。 XCode实际上并没有抛出错误,但它没有正确更新。

以下是发生的事情:

  

输入您的选择   
1 - 所有工具清单   
2 - 更新现有工具   
3 - 添加新工具   
4 - 删除工具   
5 - 结束程序   
? 3   
输入要创建的记录号(1-100):1   
输入工具名称,数量,成本   
?螺丝刀   
5

     


输入您的选择   
1 - 所有工具清单   
2 - 更新现有工具   
3 - 添加新工具   
4 - 删除工具   
5 - 结束程序   

它在输入数量后立即再次循环。实际上没有任何内容写入数据库。

我究竟错过了什么或做错了什么?我怎么能纠正这个?

#include <stdio.h>
#include <math.h>
#include <stdlib.h>


struct hardwareData
{
    int recordNum;
    char toolname[20];
    int quantity;
    double cost;
};

/* prototypes */
int enterChoice( void );
void textFile( FILE *readPtr );
void updateRecord( FILE *fPtr );
void newRecord( FILE *fPtr );
void deleteRecord( FILE *fPtr );

FILE *hfPtr;

void newRecord( FILE *fPtr )
{
    struct hardwareData hardware = { 0, "", 0, 0.0 };
    int piece;
    FILE *hfPtr = fopen("hardware.txt","rb+");

     printf( "Enter record number to create (1-100) : " );
    scanf( "%d", &piece);

    fseek( fPtr, (piece - 1) * sizeof( struct hardwareData ), SEEK_SET );

    fread( &hardware, sizeof( struct hardwareData ), 1, fPtr );

    if ( hardware.recordNum != 0 ) 
    {
        printf( "Record already exists.\n", hardware.recordNum );
    }
    else 
    { 
        printf( "Enter tool name, quantity, cost\n?" );
        scanf("%s%d%.2lf", hardware.toolname, &hardware.quantity, &hardware.cost);

        hardware.recordNum = piece;
        fseek(fPtr, (hardware.recordNum-1) * sizeof( struct hardwareData), SEEK_SET);

        fwrite( &hardware, sizeof( struct hardwareData), 1, hfPtr);
    } 
} 

2 个答案:

答案 0 :(得分:0)

fwrite( &hardware, sizeof( struct hardwareData), 1, hfPtr);

您在哪里初始化本地文件指针hfptr因此崩溃。 内部

void newRecord( FILE *fPtr )

您有一个本地变量hfPtr,但未初始化。

指针没有指向任何东西,你需要做类似的事情。

FILE *hfPtr = fopen("file","w");

答案 1 :(得分:-1)

cFptr将始终为null。当您第一次无法打开文件时,您不会更新该指针。您应该从textFile函数返回文件句柄,或者在main

中重新打开该文件

但主要是 - 学习使用xcode调试器并逐行逐步执行程序