【发布时间】:2017-10-07 04:55:47
【问题描述】:
我正在做一个自我项目,我试图学习如何编写和创建文件。有两个问题。第一个程序应该将信息写入文件,而用户提供的整数确实复制到文件中,该文件还在其创建的 txt 文件中提供了难以辨认的字符。第二个问题是,当我编译程序 #2 时,它不显示从 txt 文件输入的信息。 (旁注:我使用的库是 string、stdlib、stdio)这个程序是用 C 编写的
程序#1:
int main(void)
{
FILE *fp;
int pnum, quantity;
float price;
char num1[20];
char num2[20];
char num3[20];
char str[100] = "";
str[0] = '\0';
printf("This program stores a business inventory.\n");
fp = fopen( "inventory.txt" , "w" );
do
{
printf("Please enter item data (part number, quanitity, price): ");
scanf("%d, %d, %f", &pnum, &quantity, &price);
sprintf(num1, "%d", pnum);
sprintf(num2, "%d", quantity);
sprintf(num3, "%.1f", price);
strcat(str, num1);
strcat(str, " ");
if(pnum != 0)
{
strcat(str, num2);
strcat(str, " ");
strcat(str, num3);
strcat(str, " ");
}
else
{
strcat(str, num1);
strcat(str, " ");
strcat(str, num1);
strcat(str, " ");
strcat(str, num1);
strcat(str, " ");
}
}while( (pnum != 0));
fwrite(str , 1 , sizeof(str)+ 1 , fp);
fclose(fp);
printf("Thank you. Inventory stored in file inventory.txt.\n");
return 0;
}
程序 #2:
int main(void)
{
FILE * fp;
int pnum, quantity;
float price;
printf("Below are the items in your inventory\n");
printf("Part# Quantity Item Price\n");
fp = fopen("inventory.txt", "r");
rewind(fp);
do
{
fscanf(fp, "%d %d %f", &pnum, &quantity, &price);
printf("%5d", pnum);
printf("%9d", quantity);
printf(" $%.1f\n", price);
}while(pnum != 0);
return 0;
}
【问题讨论】:
-
您需要找到一个工具,将文件的字节转储为可读格式,例如
xxd或od -c或其他类似程序。将其应用于您的文件。我相信您会发现文件中有空字节,这会打乱读取过程。你使用了太多的strcat()操作;您应该使用sprintf()在一次调用中创建整个字符串。您必须在读取代码中检查从fscanf()返回的值——它可能会读取第一批数据;由于空字节,它可能不会再读取了。 -
是否有可能获得一个示例,说明如何将 sprintf() 与 3 个给定整数一起使用,以便在一次调用中创建整个字符串?此外,用户可以多次输入 pnum、数量、价格。 sprintf() 会添加到那个字符串吗?
-
snprintf(str, sizeof(str), "%d %d %f\n", pnum, quantity, price);可以。我部分误读了代码(我认为的形式不存在空字节问题)-但是您有一些未定义的行为。在执行strcat()操作之前,您需要在字符串的开头放置一个空字节——否则,您不知道从哪里开始复制数据。您写入的字节数不应超过str中的字节数。你应该检查字符串溢出。您还需要检查输入scanf()。需要检查所有输入。 -
请注意,
snprintf()返回它写入或将写入字符串的字符数。您可以使用它进行连接。 -
如何在字符串的开头放置一个空字节?这会修复 txt 文件中未定义的行为吗?另外,只是为了澄清。 snprintf 函数应该替换我写入程序的 strcats 吗?