当我尝试打开文件时,C分割故障



我正在尝试将文件从文件中输入到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或返回truefalse

无法打开文件后进行检查,但需要返回

即。

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

不是一个好主意

相关内容

  • 没有找到相关文章

最新更新