【问题标题】:Why am I getting a segmentation fault after printf("ID | Name | Qty. | Price\n\n");?为什么在 printf("ID | Name | Qty. | Price\n\n"); 之后出现分段错误?
【发布时间】:2016-03-13 04:44:55
【问题描述】:
    void displayAllProduct()
{
    FILE *filep;
    struct Product a;
    int id, found=0;

    system("clear");
    filep=fopen("fileproduct.txt","w+");
    printf("===========================================================================================\n");
    printf("\t\t Product Details\n\n");
    printf("===========================================================================================\n");

    printf("ID | Name | Qty. | Price\n\n");

    while(1) //infinite loop
    {
        printf("182");
        fread(&a,sizeof(a),1,filep);
        printf("184");
        if(feof(filep))
        {
            break; //done
        }
        printf("%d\t %s\t %d\t %d\n",a.id, a.name,  a.qty, a.price);
    }
    printf("===========================================================================================\n");
    fclose(filep);
}

我目前正在尝试为我的 c 编程课程制作购物车,但在尝试查看我的库存时,我不断遇到分段错误。以上是我展示产品的功能。

【问题讨论】:

  • 请发帖Minimal, Complete, and Verifiable example。至少,请向我们展示struct Product 的声明。
  • 检查fopen()是否成功,只有打开成功才尝试读取文件。
  • @MikeCAT,在这种情况下,您不需要检查fopen 的返回值,因为OP 是以w+ 模式打开它。如果文件不存在,它将被创建。
  • 您正在以w+ 模式打开fileproduct.txt,即用于写作而非阅读。如果要从中读取,请将模式更改为r
  • @TonyB 我同意,因此我对 fread 文档的建议

标签: c shopping-cart


【解决方案1】:

您没有验证fopen 的返回值,这可能 由于权限等原因失败。发生分段错误 NULL 指针取消引用,这可能正在发生 这里。您可以做的几件事:

  1. fopen之后,做:

    if (!filep) {
        perror("fopen");
        exit(1);
    }
    
  2. 在您的调试打印后添加换行符,同时使用 fflush

【讨论】:

  • 顺便说一句,您现有的文件将被覆盖为零字节,因为您以“w+”模式打开文件,因此 read 将立即返回 feof()。您也需要修复它,但这不会导致分段错误。
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
相关资源
最近更新 更多