首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不显示项目名称

不显示项目名称
EN

Stack Overflow用户
提问于 2021-06-30 22:12:08
回答 1查看 55关注 0票数 0

我正在尝试写一个库存系统程序,我只能让它显示日期或项目名称(应该是可口可乐)。这取决于我是否有fscanf的日期字符串。如果我删除日期fscanf,它将显示项目名称。如果我扫描了日期,它将不会显示物品名称。有什么帮助吗?

代码语言:javascript
复制
{
FILE *ifp; 
ifp = fopen(filename, "r");
int x = 0;
fscanf(ifp, "%d",&x);
//printf("%d",x);
for (int i = 0; i < x ; ++i)
{
  
   fgets(inventory_list[i].name,strlen(inventory_list[i].name), ifp);
   fscanf(ifp, "%d", &inventory_list[i].quant);
   fscanf(ifp, "%lf", &inventory_list[i].price);
   fscanf(ifp, "%d", &inventory_list[i].id);
   fscanf(ifp, "%s", inventory_list[i].date);
   

}

这是一个打印函数,我已经把它作为一个整体试过了,我也是分开试过的。

代码语言:javascript
复制
printf("%s",inventory_list[1].name);
printf(" %d \n %.2lf \n %d \n %s ", inventory_list[1].quant,inventory_list[1].price,inventory_list[1].id,inventory_list[1].date);

结构是这样的:

代码语言:javascript
复制
struct inventory_item
{
    
    char name[50];
    int quant;
    double price;
    int id;
    char date[10]; 

};
typedef struct inventory_item inventory;

输入文件的格式为:

代码语言:javascript
复制
3 total number or items to be sorted
coke name
79 amount of items
2.21 cost of items
12657435 item ID
12/21/2019 DATE 
EN

回答 1

Stack Overflow用户

发布于 2021-06-30 23:23:12

以下是您的代码修复:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct inventory_item
{
    char name[50];
    int quant;
    double price;
    int id;
    char date[10];
};

struct inventory_item inventory_list[10];

int main(int argc, char* argv[])
{
    FILE* ifp;
    char* filename = "inventory.txt";
    ifp = fopen(filename, "r");
    if (ifp == NULL) {
        perror(filename);
        return 1;
    }
    int x = 0;
    char buf[128];
    fgets(buf, sizeof(buf) / sizeof(buf[0]), ifp);
    if (sscanf(buf, "%d", &x) != 1) {
        fprintf(stderr, "Read of x failed\n");
        return 1;
    }
    //printf("%d",x);
    if (x > (sizeof(inventory_list) / sizeof(inventory_list[0]))) {
        fprintf(stderr, "Can't read so much items\n");
        return 1;
    }
    for (int i = 0; i < x; i++) {
        printf("Reading item %d\n", i);
        struct inventory_item* item = inventory_list + i;
        if ((fgets(buf, sizeof(buf) / sizeof(buf[0]), ifp) == NULL) ||
            (sscanf(buf, "%50s", item->name) != 1)) {
            fprintf(stderr, "Read of name failed\n");
            return 1;
        }
        if ((fgets(buf, sizeof(buf) / sizeof(buf[0]), ifp) == NULL) ||
            (sscanf(buf, "%d", &item->quant) != 1)) {
            fprintf(stderr, "Read of quant failed\n");
            return 1;
        }
        if ((fgets(buf, sizeof(buf) / sizeof(buf[0]), ifp) == NULL) ||
            (sscanf(buf, "%lf", &item->price) != 1)) {
            fprintf(stderr, "Read of price failed\n");
            return 1;
        }
        if ((fgets(buf, sizeof(buf) / sizeof(buf[0]), ifp) == NULL) ||
            (sscanf(buf, "%d", &item->id) != 1)) {
            fprintf(stderr, "Read of id failed\n");
            return 1;
        }
        if ((fgets(buf, sizeof(buf) / sizeof(buf[0]), ifp) == NULL) ||
            (sscanf(buf, "%10s", item->date) != 1)) {
            fprintf(stderr, "Read of date failed\n");
            return 1;
        }
    }
    fclose(ifp);
    return 0;
}

如您所见,我使用fgets读取文件中的所有行,并使用sscanf解析每一行。还添加了一些基本检查,以避免缓冲区/数组溢出。

当然,还有增强的空间。例如,在出现错误的情况下,在返回之前关闭文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68196439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档