不是一个好主意
我正在尝试将文件从文件中输入到struct中,但是每当我尝试将路径输入"文件名"变量中时,它会给我终端中的分割故障:
商品重新订购文件程序输入数据库文件/stock.txt分段故障
这是我的代码。另外,我目前正在运行OSX 10.5.8,如果这是相关的。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
struct goods
{
char name[20];
float price;
int quantity;
int reorder;
};
FILE *input_file;
void processfile(void);
void getrecord(struct goods *recptr);
void printrecord(struct goods record);
int main(void)
{
char filename[40];
printf("Goods Re-Order File programn");
printf("Enter database filen");
scanf("%s",filename);
//strcpy(filename,"/stock.txt");
//gets(filename);
input_file=fopen(filename,"r");
if(!input_file)
{
printf("Could not open file!n");
}
processfile();
fclose(input_file);
return 0;
}
void processfile(void)
{
struct goods record;
while(!feof(input_file))
{
getrecord(&record);
if(record.quantity<=record.reorder)
{
printrecord(record);
}
}
}
void getrecord(struct goods *recptr)
{
int loop=0,number,toolow;
char buffer[40],ch;
float cost;
ch=fgetc(input_file);
while (ch!='n')
{
buffer[loop++]=ch;
ch=fgetc(input_file);
}
buffer[loop]=0;
strcpy(recptr->name,buffer);
fscanf(input_file,"%f",&cost);
recptr->price=cost;
fscanf(input_file,"%d",&number);
recptr->quantity=number;
fscanf(input_file,"%d",&toolow);
recptr->reorder=toolow;
}
void printrecord(struct goods record)
{
printf("nProduct namet%sn",record.name);
printf("Product price t%fn",record.price);
printf("Product quantity t%dn",record.quantity);
printf("Product reorder level t%dn",record.reorder);
}
您的问题在这里:
while(!feof(input_file))
您应该仅在循环结束时阅读。尝试以下操作:
struct goods record;
getrecord(&record);
while(!feof(input_file))
{
if(record.quantity<=record.reorder)
{
printrecord(record);
}
getrecord(&record);
}
如果找到EOF
,您还需要修改getrecord
以退出。
这样的东西(未经测试):
void getrecord(struct goods *recptr)
{
int loop=0,number,toolow;
char buffer[BUFFER_SIZE];
int ch;
float cost;
ch=fgetc(input_file);
if (ch == EOF) //if last element already read, will be EOF
return;
while (ch!='n' && ch != EOF && loop < BUFFER_SIZE) //BUFFER_SIZE
{
buffer[loop++]=(char)ch;
ch=fgetc(input_file);
}
if (ch == EOF) //check for unexpected EOF
return;
//...
您也可以根据是否读取EOF
更改getrecord
或返回true
或false
。
无法打开文件后进行检查,但需要返回
即。
if(!input_file)
{
printf("Could not open file!n");
return -1;
}
编辑
getrecord
中的循环应为
while (ch!='n' && ch != EOF && loop < 39)
{
buffer[loop++]=ch;
ch=fgetc(input_file);
}
因此,您不会超越缓冲区。
结构应该是(缓冲区可能是40个字符)
struct goods
{
char name[40];
btw-将钱存储为floats