gpt4 book ai didi

c++ - 为什么它拒绝将整数的二进制写入文件?

转载 作者:行者123 更新时间:2023-11-28 01:32:32 24 4
gpt4 key购买 nike

我遇到了这个问题 - 当我尝试将整数的二进制写入文件时,它不会将其写入交付文件中。

我的整个想法是获取整数,将其转换为二进制,然后将其写入文件。之后,如果需要,我会回到程序中,写入一个新的整数值,然后将新值添加到已经写入的值中。即文件中的“5”,回来,写“3”,然后文件中有 8。

代码如下:

#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

char answer;

struct PRODUCT {
string product_name;
int quantity;
PRODUCT() : product_name(""), quantity(0) {}
} product;

int main () {
fstream delivery_file("files/Delivery", ios::app | ios::in | ios::out | ios::binary);
do {

if (delivery_file.is_open()) {
cout << "\nPlease input the name of a product: ";

getline(cin, product.product_name);

cout << "\nPlease input the quantity of a product: ";
string str;
getline(cin, str);
product.quantity = atoi(str.c_str());

bool foundAndReplaced = false;

while (!delivery_file.eof())
{
PRODUCT temp_prod;
while (!delivery_file.eof())
{
char ch = delivery_file.get();
temp_prod.product_name += ch;
if (ch == 0)
{
break;
}
}
if (delivery_file.eof() && delivery_file.tellg() == ios::beg)
{
cout << "Error: Unexpected end of file.\n";
delivery_file.clear();
break;
}
if (temp_prod.product_name == product.product_name)
{
delivery_file.seekp(delivery_file.tellg());
delivery_file.read((char*)(temp_prod.quantity), sizeof(PRODUCT::quantity));
product.quantity += temp_prod.quantity;
delivery_file.write((char*)(product.quantity), sizeof(PRODUCT::quantity));
foundAndReplaced = true;
}
}

if (!foundAndReplaced)
{
delivery_file.write(product.product_name.c_str(), product.product_name.length() + 1);

delivery_file.write((char*)(&product.quantity), sizeof(product.quantity));
}

}

else {
cout << "Unable to open file";
}


cout << "Do you want to add more products? Y/N \n";
answer = 0;
while (answer != 'y' && answer != 'Y' && answer != 'n' && answer != 'N')
{
answer = _getch();
}
}
while(answer == 'Y' || answer == 'y');
delivery_file.close();

cout << "\nDeliveries registered.\n";

return 0;
}

最佳答案

使用 ios::binary 不会将二进制数据写入文件,它只是禁用一些格式,参见 What the point of using std::ios_base::binary?例如。

如果你想将一个整数作为二进制文件写入一个文件,我建议你使用这样的东西:

int foo = 0x0F00;
ofstream bar("test.txt", ios::out | ios::binary);
bar.write(reinterpret_cast<char*>(&foo), sizeof(int));
bar.close();

这将采用整数,将其重新解释为字符序列,并在不格式化的情况下将其输出到文件(为此需要 ios::binary)。

鉴于您已经编辑了问题:您不能像这样在磁盘上求和,您只能以字节为单位写入,这将覆盖之前存在的任何数据。要做你想做的事,你必须阅读数字,总结它然后写下来。您可以通过使用 foo.read(...)foo 现在是 fstream 并使用 ios::in< 打开来做到这一点 还有。

关于c++ - 为什么它拒绝将整数的二进制写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50834206/

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