我正在做家务工作。这是实际的任务:
硬件清单 - 编写数据库以跟踪工具,其成本和数量。您的程序应该将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);
}
}
答案 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调试器并逐行逐步执行程序