我最近了解了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
页面是您的朋友。如果你想要更多的信息fscanf
做man fscanf
在你的终端或查找fscanf
在谷歌手册页。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句