gpt4 book ai didi

FILE I/O 中的 C 程序搜索

转载 作者:行者123 更新时间:2023-11-30 15:06:34 25 4
gpt4 key购买 nike

我的代码应该查找产品 ID、名称、数量和价格。输入产品 ID 时,应打印产品 ID 所在的整行。

文本文件包含以下输入:

1 CADBURY 999 1.900000
2 PEPSI 999 2.500000
3 IPHONE 976 2500.000000
4 SPIRULINA 100 50.000000

代码已使用输入“4”进行编译。但输出是循环的:

Please enter product ID :

它没有读取整行“4”。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <ctype.h>

int addProduct();

struct product
{
int quantity, reorder, i, id;
char name[20];
float price;
};

int secondmain()
{
FILE * fp;

int i=0;
struct product a;
system("cls");

char checker;



do
{
fp = fopen("addproduct.txt","a+t");
system("cls");

printf("Enter product ID : ");
scanf(" %d", &a.id);

printf("Enter product name : ");
scanf(" %s", a.name);

printf("Enter product quantity : ");
scanf(" %d", &a.quantity);

printf("Enter product price : ");
scanf(" %f", &a.price);


fprintf(fp, "%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);
printf("Record saved!\n\n");

fclose(fp);

printf("Do you want to enter new product? Y / N : ");

scanf(" %c", &checker);
checker = toupper(checker);

i++;

system("cls");
}
while(checker=='Y');



if(checker == 'N')
{
fp = fopen("addproduct.txt","r");

while(fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price)==4)
{
fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price);
printf("%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);
}

fclose(fp);

}


return(0);
}

/*-------------- ERROR START HERE-----------------*/

int main()
{
FILE * fp;
system("cls");
struct product a;
char array[255];
int productID;

fp = fopen("addproduct.txt","r");

while(1){
fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price);

productID = atoi(array);

printf("Please enter product ID : ");
scanf(" %d", &productID);

if(productID == a.id)
{
fgets(array, 255, (FILE*)fp);
printf("%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);

}

}
return(0);
}

最佳答案

while (fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price) == 4)
{
fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price);
printf("%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);
}

您调用 fscanf 两次,它会跳过每第二行。

fgets(array, 255, (FILE*)fp);
printf("%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);

这部分正在将行读入文本。然后它应该使用 sscanf 或 strtok 来解​​析行。

您可能还需要刷新标准输入,否则 scanf("%c", &checker) 可能无法工作。将其分解为函数使事情变得更容易。示例:

int find_item_by_id(const char* fname, int find_id)
{
int found = 0;
struct product a;
FILE *fp = fopen(fname, "r");
if (fp)
{
while (fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price) == 4)
{
if (a.id == find_id)
{
found = 1;
break;
}
}
fclose(fp);
}

return found;
}

void add_item(const char* fname)
{
struct product a;
printf("Enter product ID : ");
scanf(" %d", &a.id);

printf("Enter product name : ");
scanf(" %s", a.name);

printf("Enter product quantity : ");
scanf(" %d", &a.quantity);

printf("Enter product price : ");
scanf(" %f", &a.price);

if (find_item_by_id(fname, a.id) != 0)
{
printf("item already exists\n");
return;
}

FILE *fp = fopen(fname, "a+");
if (fp)
{
fprintf(fp, "%d %s %d %.2f\n", a.id, a.name, a.quantity, a.price);
fclose(fp);
}
}

int main()
{
const char* filename = "c:\\test\\_test.txt";

printf("list:\n");
struct product a;
FILE *fp = fopen(filename, "r");
if (fp)
{
while (fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price) == 4)
printf("%d %s %d %f\n", a.id, a.name, a.quantity, a.price);
fclose(fp);
}

while(1)
{
add_item(filename);

printf("Add nother item? (y/n)\n");
int result;
while (1)
{
result = getchar();
if (result == 'y' || result == 'n')
break;
}
if (result != 'y')
break;
}

return 0;
}

关于FILE I/O 中的 C 程序搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38946700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com