读取文件中的struct数组,并在特定条件下读取printf特定行[C语言]

布莱恩

我最近了解了C编程中的文件处理。然后我得到了作业,这使我可以读取.txt文件中的数据并打印出数据

我面临问题是当我输入选择时,输出出现随机外来词*(像╝c 0.00 6?φ↨ê■`0.00)。但是我想我对它进行了正确的编码(打开并关闭文件,用fread读取文件),但是我不明白为什么我的程序出错了。我在youtube和google上花了将近3天的时间,但我仍然失败了,而且几乎快到了到期日。

有人可以帮帮我吗?真的谢谢你 另外,如果您有空,请向我显示此程序的正确代码,以便我作为参考。如果您还不满意,请:D //我的系统流程是否正确,如果我想读取文件,并在一定条件下从文件中打印特定行。(例如,定义struct> open> if-else语句> do -while循环> end)?或者我们有其他更流畅的流程图

//我是否有可能读取文件的所有行,但只打印出一行特定行?如果是,我们该怎么做?

这里的问题car.txt文件显示了各种汽车制造商,型号,颜色和价格。设计一个程序,从car.txt中读取汽车制造商,型号,颜色和价格。列出用户的价格选项以供选择。该程序将能够根据价格范围的选择在屏幕上显示特定汽车制造商的屏幕,型号,颜色和价格。

下面是.txt文件

丰田Altis银120000.00

丰田威驰Black 90000.00

本田雅阁黑152000.00

本田思域银118000.00

日产Cefiro黑色151000.00

日产轩逸银色121000.00

质子总理黑110000.00

质子Waja蓝色70000.00


//this was my code//
#include <stdio.h>
struct CarType
{

    char carmaker[10],model[10],colour[10];
    float price;
};

int main ()
{
    char option;
    FILE *fp;
    struct CarType car[8];

    if((fp = fopen("carM.txt", "r")) == NULL)
        printf("file cant be open");

    else
        {
            while (!feof(fp))
            {
                fread(&car[8], sizeof(struct CarType), 8, fp);

                printf("\nChoose your option");
                printf("\n1-List car price equal or above RM120,000");
                printf("\n2-List car price RM120,000-RM149,999");
                printf("\n3-List car price RM50,000-RM119,999");
                printf("\n4-End program");
                printf("\n>> ");


                do
                    {
                        scanf("%c",&option);

                    if (option == '1')
                    {
                        printf("\nCar price equal or above RM120,000");
                        printf("\n %s %s %s %.2f",car[0].carmaker, car[0].model, car[0].colour, car[0].price);
                        printf("\n %s %s %s %.2f",car[2].carmaker, car[2].model, car[2].colour, car[2].price);
                        printf("\n %s %s %s %.2f",car[4].carmaker, car[4].model, car[4].colour, car[4].price);
                        printf("\n %s %s %s %.2f",car[5].carmaker, car[5].model, car[5].colour, car[5].price);
                        break;
                    }
                    if (option == '2')
                    {
                        printf("\nCar price RM120,000-RM149,999");
                        printf("\n %s %s %s %.2f",car[0].carmaker, car[0].model, car[0].colour, car[0].price);
                        printf("\n %s %s %s %.2f",car[5].carmaker, car[5].model, car[5].colour, car[5].price);
                        break;
                    }
                    if (option == '3')
                    {
                        printf("\nCar price RM50,000-RM119,999");
                        printf("\n %s %s %s %.2f",car[1].carmaker, car[1].model, car[1].colour, car[1].price);
                        printf("\n %s %s %s %.2f",car[3].carmaker, car[3].model, car[3].colour, car[3].price);
                        printf("\n %s %s %s %.2f",car[6].carmaker, car[6].model, car[6].colour, car[6].price);
                        printf("\n %s %s %s %.2f",car[7].carmaker, car[7].model, car[7].colour, car[7].price);
                        break;
                    }
                    if (option == '4')
                    {
                        printf("\nEnd pf Program");

                    }

                    else
                    {
                        printf("Error input");
                    }

                }while(option!= '4');


            }fclose (fp);

        }

return 0;
}
杰弗里·卡斯珀

这是一个逻辑错误,恰好改变了程序的其余部分。

fread(&car[8], sizeof(struct CarType), 8, fp);

首先,这是缓冲区溢出。它从分配的缓冲区的末尾开始写入内存。您可能在想这个:

fread(car, sizeof(struct CarType), 8, fp);

其次,假设每行恰好是结构的大小(34字节)。因此,在这种情况下,我将避免使用fread,因为您不知道每行的大小。

我建议改用这个:

int fscanf(FILE *stream, const char *format, ...);

例:

FILE* txtFile = fdopen("test.txt","r");
char a[10],b[10];
fscanf(txtFile, "%s %s\n", a, b);

总而言之,您应该一次阅读一行,fscanf并且在完成所有数据的解析之后,您应该遍历所有汽车以打印出满足正确定价范围的所有汽车。

建议:为您的结构创建打印功能可能会有所帮助。这种原型的东西:

void printCar(CarType* car);

另外,man页面是您的朋友。如果你想要更多的信息fscanfman fscanf在你的终端或查找fscanf在谷歌手册页。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python-在特定条件下选择数组的行?

来自分类Dev

在特定条件下计算数组中的值

来自分类Dev

如何在ORACLE中累积特定列并在特定条件下释放值

来自分类Dev

逐行读取csv文件并保存满足特定条件的行

来自分类Dev

添加新行并在特定条件下复制单元格的值

来自分类Dev

在特定条件下迭代文件夹的文件

来自分类Dev

如何在特定条件下查找R中的特定行或列

来自分类Dev

计算特定条件下的行均值

来自分类Dev

如何在特定条件下从文件中提取行

来自分类Dev

PANDAS中特定条件下的累计计数

来自分类Dev

在特定条件下查找ArrayList中的值

来自分类Dev

特定条件下Mysql中的计算

来自分类Dev

在特定条件下使用lodash添加和合并对象数组中的重复项

来自分类Dev

在特定条件下选择列

来自分类Dev

在特定条件下播放winsound

来自分类Dev

在特定条件下创建组

来自分类Dev

C#数据表在特定条件下选择最后一行

来自分类Dev

读取文件,并在Python中打印文件的特定行

来自分类Dev

JSON:使用C#在特定条件下获取列表中的属性值

来自分类Dev

从C中的文件读取特定行

来自分类Dev

C 程序从文件中读取特定行

来自分类Dev

在特定条件下获取数据集的特定值

来自分类Dev

在特定条件下基于两个数组快速创建新数组

来自分类Dev

SAS:无法在特定条件下使用where或if条件。

来自分类Dev

如何使读取文件超过特定行的条件?

来自分类Dev

在特定条件下使用字符串 python 导入文件

来自分类常见问题

获取特定条件下的数据透视值

来自分类Dev

linq在特定条件下获得多个值

来自分类Dev

Python在特定条件下停止嗅探

Related 相关文章

热门标签

归档