读取浮点-C时的块I/O问题

读取浮点-C时的块I/O问题,c,file-io,while-loop,C,File Io,While Loop,我最近一直在尝试编写一个文件编写程序,保存零件号、数量和零件价格的库存统计信息。在写入二进制文件时,我的scanf保存了我的价格,但当我在下一个程序中读取它们时,它会产生大量无意义的数字,这些数字不是我输入的。 带写程序的编译器:(**是用户输入) This program stores a business inventory. Please enter item data (part number, quantity, price): *2, 3, 1.6* Please enter ite

我最近一直在尝试编写一个文件编写程序,保存零件号、数量和零件价格的库存统计信息。在写入二进制文件时,我的scanf保存了我的价格,但当我在下一个程序中读取它们时,它会产生大量无意义的数字,这些数字不是我输入的。 带写程序的编译器:(**是用户输入)

This program stores a business inventory.
Please enter item data (part number, quantity, price): *2, 3, 1.6*
Please enter item data (part number, quantity, price): *3, 1, 5.3*
Please enter item data (part number, quantity, price): *0*
Thank you. Inventory stored in file inventory.txt
编写程序代码

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

int main(int argc, int argv[])
{
int pnum=1, quantity;
float price;
FILE *fp1;

fp1 = fopen("inventory.txt", "wb+");
if(fp1 == NULL)
{
    printf("Can't open!\n");
    exit(EXIT_FAILURE);
}

printf("This program stores a business inventory.\n");
while(pnum != 0)
{
printf("Please enter item data (part number, quantity, price): ");
scanf("%d, %d, %f", &pnum, &quantity, &price);
printf("%d, %d, %f", pnum, quantity, price);
fwrite(&pnum, sizeof(int), 1, fp1);// Is there a way to combine these 3 fwrites into 1?
fwrite(&quantity, sizeof(int), 1, fp1);
fwrite(&price, sizeof(float), 1, fp1);
}
printf("Thank you. Inventory stored in file inventory.txt");
fclose(fp1);
return 0;


}
#include <stdio.h>
#include <stdlib.h>

int main()
{
int pnum, quantity;
float price;
FILE *fp1 = fopen("inventory.txt", "rb");
if(fp1 == NULL)
{
    printf("Can't open!");
    exit(EXIT_FAILURE);
}
printf("Below are the items in your inventory.\n");

printf("Part#\tQuantity\t Item Price\n");
while (fread(&pnum, sizeof(int), 1, fp1) == 1)//Is there a way to combine these 3 freads into 1 line of code?
{
    printf("%5d\t", pnum);
}
while (fread(&quantity, sizeof(int), 1, fp1) == 1)
{
    printf("%8d\t", quantity);
}
while (fread(&price, sizeof(float), 1, fp1) == 1)
{
    printf("$");
    printf("%9.2f\n", price);

}
fclose(fp1);
return 0;

}
读取程序代码

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

int main(int argc, int argv[])
{
int pnum=1, quantity;
float price;
FILE *fp1;

fp1 = fopen("inventory.txt", "wb+");
if(fp1 == NULL)
{
    printf("Can't open!\n");
    exit(EXIT_FAILURE);
}

printf("This program stores a business inventory.\n");
while(pnum != 0)
{
printf("Please enter item data (part number, quantity, price): ");
scanf("%d, %d, %f", &pnum, &quantity, &price);
printf("%d, %d, %f", pnum, quantity, price);
fwrite(&pnum, sizeof(int), 1, fp1);// Is there a way to combine these 3 fwrites into 1?
fwrite(&quantity, sizeof(int), 1, fp1);
fwrite(&price, sizeof(float), 1, fp1);
}
printf("Thank you. Inventory stored in file inventory.txt");
fclose(fp1);
return 0;


}
#include <stdio.h>
#include <stdlib.h>

int main()
{
int pnum, quantity;
float price;
FILE *fp1 = fopen("inventory.txt", "rb");
if(fp1 == NULL)
{
    printf("Can't open!");
    exit(EXIT_FAILURE);
}
printf("Below are the items in your inventory.\n");

printf("Part#\tQuantity\t Item Price\n");
while (fread(&pnum, sizeof(int), 1, fp1) == 1)//Is there a way to combine these 3 freads into 1 line of code?
{
    printf("%5d\t", pnum);
}
while (fread(&quantity, sizeof(int), 1, fp1) == 1)
{
    printf("%8d\t", quantity);
}
while (fread(&price, sizeof(float), 1, fp1) == 1)
{
    printf("$");
    printf("%9.2f\n", price);

}
fclose(fp1);
return 0;

}
#包括
#包括
int main()
{
int pnum,数量;
浮动价格;
文件*fp1=fopen(“inventory.txt”、“rb”);
如果(fp1==NULL)
{
printf(“无法打开!”);
退出(退出失败);
}
printf(“以下是库存中的项目。\n”);
printf(“零件\t数量\t项目价格\n”);
while(fread(&pnum,sizeof(int),1,fp1)==1)//有没有办法将这3个fread组合成一行代码?
{
printf(“%5d\t”,pnum);
}
while(fread(&quantity,sizeof(int),1,fp1)==1)
{
printf(“%8d\t”,数量);
}
while(fread(&price,sizeof(float),1,fp1)==1)
{
printf($);
printf(“%9.2f\n”,价格);
}
fclose(fp1);
返回0;
}
正如您可能看到的,scanf是scanf,必须与我的float有关,但我一直无法确定如何修复它,因为没有scanf,任何东西都不会保存到我的inventory.txt文件中(我没有包括.txt文件,因为它是二进制文件),并且由于某种原因,当我键入0以打破循环时,它会将0保存在文件中。如果需要任何其他信息,我可以提供,但我想我已经提供了一切。感谢您的帮助,并愉快地编码:)

  • 零被插入到数组中,因为
    while
    循环仅在
    fwrite
    调用后中断。您可以使用
    break
    我相信在
    扫描后立即退出
  • 要组合写操作和读操作,可以使用结构,但请注意,由于以下原因,您可能应该从/反序列化到完全相同的结构中
  • 我发现,由于写入/读取顺序或填充错误,将
    fread
    s放入浮点会产生奇怪的结果。尝试在结构中读写,看看这是否解决了您的问题。如果这不起作用,请尝试使用
    %x
    打印浮点的十六进制值。然后与预期结果进行比较
考虑以下代码:

#include <stdio.h>
#include <fcntl.h> // for open
#include <unistd.h> // for close


typedef struct
{
    float price;
    int pnum;
    int quantity;
} shoppingItem;


void writeToFile(FILE *fp) {    
    shoppingItem input1 = {1.1,2,3};
    shoppingItem input2 = {3.1412,42,666};
    fwrite(&input1, sizeof(shoppingItem), 1, fp);
    fwrite(&input2, sizeof(shoppingItem), 1, fp);
    printf("%f %d %d\n", input1.price, input1.pnum, input1.quantity);
    printf("%f %d %d\n", input2.price, input2.pnum, input2.quantity);
}

void readFromFile(FILE *fp) {
    shoppingItem output1 = {0.0,0,0};
    shoppingItem output2 = {0.0,0,0};
    fread(&output1, sizeof(shoppingItem), 1, fp);
    fread(&output2, sizeof(shoppingItem), 1, fp);
    printf("%f %d %d\n", output1.price, output1.pnum, output1.quantity);
    printf("%f %d %d\n", output2.price, output2.pnum, output2.quantity);
}

int main()
{
    FILE *fp = fopen("inventory.txt", "wb+");
    if(fp == NULL)
    {
        printf("Can't open!\n");
        return 1;
    }

    writeToFile(fp);
    rewind(fp);
    readFromFile(fp);

    if (fclose(fp) == 0) {
        printf("Done\n");
        return 0;
    } else {
        printf("Error on closing file\n");
        return 1;
    }
}
#包括
#包括//用于打开
#包含//以关闭
类型定义结构
{
浮动价格;
int pnum;
整数;
}购物项目;
无效写入文件(文件*fp){
shoppingItem input1={1.1,2,3};
shoppingItem input2={3.1412,42666};
fwrite(&input1,sizeof(shoppingItem),1,fp);
F写入和输入2,尺寸(购物项目),1,fp;
printf(“%f%d%d\n”,input1.price,input1.pnum,input1.quantity);
printf(“%f%d%d\n”,input2.price,input2.pnum,input2.quantity);
}
void readFromFile(文件*fp){
shoppingItem output1={0.0,0,0};
shoppingItem output2={0.0,0,0};
fread(&output1,sizeof(shoppingItem),1,fp);
fread(&output2,sizeof(shoppingItem),1,fp);
printf(“%f%d%d\n”,output1.price,output1.pnum,output1.quantity);
printf(“%f%d%d\n”,output2.price,output2.pnum,output2.quantity);
}
int main()
{
文件*fp=fopen(“inventory.txt”、“wb+”);
如果(fp==NULL)
{
printf(“无法打开!\n”);
返回1;
}
写入文件(fp);
倒带(fp);
readFromFile(fp);
如果(fclose(fp)==0){
printf(“完成”\n);
返回0;
}否则{
printf(“关闭文件时出错\n”);
返回1;
}
}
  • 零被插入到数组中,因为
    while
    循环仅在
    fwrite
    调用后中断。您可以使用
    break
    我相信在
    扫描后立即退出
  • 要组合写操作和读操作,可以使用结构,但请注意,由于以下原因,您可能应该从/反序列化到完全相同的结构中
  • 我发现,由于写入/读取顺序或填充错误,将
    fread
    s放入浮点会产生奇怪的结果。尝试在结构中读写,看看这是否解决了您的问题。如果这不起作用,请尝试使用
    %x
    打印浮点的十六进制值。然后与预期结果进行比较
考虑以下代码:

#include <stdio.h>
#include <fcntl.h> // for open
#include <unistd.h> // for close


typedef struct
{
    float price;
    int pnum;
    int quantity;
} shoppingItem;


void writeToFile(FILE *fp) {    
    shoppingItem input1 = {1.1,2,3};
    shoppingItem input2 = {3.1412,42,666};
    fwrite(&input1, sizeof(shoppingItem), 1, fp);
    fwrite(&input2, sizeof(shoppingItem), 1, fp);
    printf("%f %d %d\n", input1.price, input1.pnum, input1.quantity);
    printf("%f %d %d\n", input2.price, input2.pnum, input2.quantity);
}

void readFromFile(FILE *fp) {
    shoppingItem output1 = {0.0,0,0};
    shoppingItem output2 = {0.0,0,0};
    fread(&output1, sizeof(shoppingItem), 1, fp);
    fread(&output2, sizeof(shoppingItem), 1, fp);
    printf("%f %d %d\n", output1.price, output1.pnum, output1.quantity);
    printf("%f %d %d\n", output2.price, output2.pnum, output2.quantity);
}

int main()
{
    FILE *fp = fopen("inventory.txt", "wb+");
    if(fp == NULL)
    {
        printf("Can't open!\n");
        return 1;
    }

    writeToFile(fp);
    rewind(fp);
    readFromFile(fp);

    if (fclose(fp) == 0) {
        printf("Done\n");
        return 0;
    } else {
        printf("Error on closing file\n");
        return 1;
    }
}
#包括
#包括//用于打开
#包含//以关闭
类型定义结构
{
浮动价格;
int pnum;
整数;
}购物项目;
无效写入文件(文件*fp){
shoppingItem input1={1.1,2,3};
shoppingItem input2={3.1412,42666};
fwrite(&input1,sizeof(shoppingItem),1,fp);
F写入和输入2,尺寸(购物项目),1,fp;
printf(“%f%d%d\n”,input1.price,input1.pnum,input1.quantity);
printf(“%f%d%d\n”,input2.price,input2.pnum,input2.quantity);
}
void readFromFile(文件*fp){
shoppingItem output1={0.0,0,0};
shoppingItem output2={0.0,0,0};
fread(&output1,sizeof(shoppingItem),1,fp);
fread(&output2,sizeof(shoppingItem),1,fp);
printf(“%f%d%d\n”,output1.price,output1.pnum,output1.quantity);
printf(“%f%d%d\n”,output2.price,output2.pnum,output2.quantity);
}
int main()
{
文件*fp=fopen(“inventory.txt”、“wb+”);
如果(fp==NULL)
{
printf(“无法打开!\n”);
返回1;
}
写入文件(fp);
倒带(fp);
readFromFile(fp);
如果(fclose(fp)==0){
printf(“完成”\n);
返回0;
}否则{
printf(“关闭文件时出错\n”);
返回1;
}
}

您在“阅读程序”中获得的奇怪值完全有效,但。。。它们被编码为IEEE-754浮点值。如果您将
5.3
编码为IEEE-754,您将得到
0x40a9999a
,它等于
1084856730
,因此您的读数是好的,而输出它却有问题

将printf格式从
%9.2f
更改为仅
%f