我正在尝试写一个库存系统程序,我只能让它显示日期或项目名称(应该是可口可乐)。这取决于我是否有fscanf的日期字符串。如果我删除日期fscanf,它将显示项目名称。如果我扫描了日期,它将不会显示物品名称。有什么帮助吗?
{
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);
}这是一个打印函数,我已经把它作为一个整体试过了,我也是分开试过的。
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);结构是这样的:
struct inventory_item
{
char name[50];
int quant;
double price;
int id;
char date[10];
};
typedef struct inventory_item inventory;输入文件的格式为:
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 发布于 2021-06-30 23:23:12
以下是您的代码修复:
#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解析每一行。还添加了一些基本检查,以避免缓冲区/数组溢出。
当然,还有增强的空间。例如,在出现错误的情况下,在返回之前关闭文件。
https://stackoverflow.com/questions/68196439
复制相似问题