Почему он отказывается записать двоичный файл целого числа в файл? - PullRequest
0 голосов
/ 13 июня 2018

У меня возникла эта проблема - когда я пытаюсь записать двоичное целое число в файл, оно не записывается в файл доставки.

Вся моя идея заключалась в том, чтобы взять целое число, преобразовать его вдвоичный файл, запишите его в файл.После этого при необходимости я вернусь в программу, напишу новое целочисленное значение, а затем добавлю новое значение к уже написанному.то есть "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;
}

1 Ответ

0 голосов
/ 13 июня 2018

Использование ios::binary не заставляет его записывать двоичные данные в файл, оно просто отключает некоторое форматирование, см. Какой смысл использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...