1 Востаннє редагувалося koala (26.01.2019 12:04:49)

Тема: Робота з бінарними файлами

Koala написав:

Оригінальний заголовок: Допоможыть(С++(робота з бінарними файлами в стилі ООП))

Замінити всі вибрані числа в масиві на інші.
замінити  b = 4 на a = 888
ось мій код

Прихований текст
#include <iostream>
#include <fstream>
using namespace std;
void main() {
    /*int A[20]{ 3,7,3,2,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 };
    ofstream fout("D://text//1.txt", ios_base::ate | ios_base::binary);
    if (fout.is_open()) {
        fout.write((char*)A, sizeof(A));
    }
    fout.close();
    int B[20] = { 0 };
    fstream fin("D://text//1.txt", ios_base::in | ios_base::binary);
    if (fin.is_open()) {
        fin.read((char*)B, sizeof(B));
    }
    fin.close();
    for (int i = 0; i < 20; i++) {
    cout << B[i] << " ";
    }*/
    int a = 888, b = 4, tmp, j = 0, p;
    fstream f("D://text//1.txt", ios_base::app | ios_base::in | ios_base::binary);
    if (f.is_open()) {
        f.seekp(ios_base::beg);
        for (int i = 0; i < 20; i++) {
            p = f.tellp();
            f.read((char*)&tmp, sizeof(tmp));
            if (tmp == b) {
                f.write((char*)&a, sizeof(a));
                f.flush();
                j = 2;
            }
            else {
                j = 1;
            }
            if (j == 1) {
                f.seekp(sizeof(int)*p, ios_base::beg);
            }
            if (j == 2) {
                f.seekg(sizeof(int)*p - 1, ios_base::beg);
            }
        }
        int B[20] = { 0 };
        f.read((char*)B, sizeof(B));
        f.close();
        for (int i = 0; i < 20; i++) {
        cout << B[i] << " ";
        }
    }
    system("pause");
}

Це потрібно для запису нових даних(якщо під час зміни вони пошкодились або занулились)

Прихований текст
/*int A[20]{ 3,7,3,2,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 };
    ofstream fout("D://text//1.txt", ios_base::ate | ios_base::binary);
    if (fout.is_open()) {
        fout.write((char*)A, sizeof(A));
    }
    fout.close();
    int B[20] = { 0 };
    fstream fin("D://text//1.txt", ios_base::in | ios_base::binary);
    if (fin.is_open()) {
        fin.read((char*)B, sizeof(B));
    }
    fin.close();
    for (int i = 0; i < 20; i++) {
    cout << B[i] << " ";
    }*/

а ось це заміна вибраного числа на інше

Прихований текст
int a = 888, b = 4, tmp, j = 0, p;
    fstream f("D://text//1.txt", ios_base::app | ios_base::in | ios_base::binary);
    if (f.is_open()) {
        f.seekp(ios_base::beg);
        for (int i = 0; i < 20; i++) {
            p = f.tellp();
            f.read((char*)&tmp, sizeof(tmp));
            if (tmp == b) {
                f.write((char*)&a, sizeof(a));
                f.flush();
                j = 2;
            }
            else {
                j = 1;
            }
            if (j == 1) {
                f.seekp(sizeof(int)*p, ios_base::beg);
            }
            if (j == 2) {
                f.seekg(sizeof(int)*p - 1, ios_base::beg);
            }
        }
        int B[20] = { 0 };
        f.read((char*)B, sizeof(B));
        f.close();
        for (int i = 0; i < 20; i++) {
        cout << B[i] << " ";
        }
    }

при заміні в мене нічого не міняє, який був масив такий і залишається

2

Re: Робота з бінарними файлами

Для початку - у вас прапорець j виставляється й одразу використовується. Перенесіть блоки коду з if(j==...) туди, де j виставляється.
І нащо ви множите sizeof(int) на p, тобто позицію в байтах? Що ви хочете при цьому отримати?

Подякували: Parsifal1

3

Re: Робота з бінарними файлами

І ніякого "стилю ООП" тут і близько немає. Ви використовуєте бібліотеку fstream і все.

Подякували: Parsifal1

4

Re: Робота з бінарними файлами

незнаю я вже методом вгадуваня пробую це завданя виконати сам нерозумію що робиться

5

Re: Робота з бінарними файлами

А ви спробуйте розібратися. От просто на аркуші намалюйте файл як стрічку з квадратиків-байтів, "поріжте" її на групи по 4 (int-и) і подивіться, що відбувається зі вказівниками, коли ви читаєте/пишете. До речі, якщо відкручуєте вказівники - робіть це безпосередньо перед операцією читання/запису, так буде значно легше зрозуміти, що відбувається.

Подякували: Parsifal1

6

Re: Робота з бінарними файлами

дякую коало

7

Re: Робота з бінарними файлами

Основна частина:

       for (int i = 0; i < 20; i++) {
            int tmp;
            f.read((char*)&tmp, sizeof(int));
            if (tmp == b) {
                f.seekp(f.tellg()-sizeof(int), ios_base::beg); //будемо писати в попередній елемент перед тим, на який показує tellg
                f.write((char*)&a, sizeof(int));
            }
       }
       f.flush();//тепер можна