Форум программистов, компьютерный форум CyberForum.ru

Файлы (чтение/запись) - C++

Восстановить пароль Регистрация
 
albannikov
 Аватар для albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 75
31.10.2013, 06:54     Файлы (чтение/запись) #1
Привет всем.
Уважаемые программисты! Второй день мучаюсь.. помогите плиз..
Забираю из текстового файла информацию и передаю её в бинарный файл..
txt выводится на экран нормально, а bin перед концом файла выводит какие то нули.
Откуда взялись не могу понять . Очень нужна Ваша помошь, а то всю голову сломал уже
скрин и файлы прилагаю.. при необходимости могу скинуть весь проект.

Функция записи из TXT в BIN
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void WhriteBin()                                                // Запись из TXT в BIN
{   
    system("CLS");  
    ofstream bfile;
    bfile.open("base.bin", ios_base::); 
    bfile.write ((char *) &KOL, sizeof(int));       
 
    int i = 0;
    int spisok = 0;
    ifstream infile;                        // для ввода (чтения) данных из файла       
    infile.open ("base.txt");               // Открыли файл 
 
    while (! infile.eof())                      
    {
                            
        infile >> Sklad[i].tip >> Sklad[i].firma >> Sklad[i].model;
        infile >> Sklad[i].god >> Sklad[i].serial >> Sklad[i].inventar;
        infile >> Sklad[i].sost;
        infile >> Sklad[i].sred;        
        i++;
        spisok++;
        
    }
    bfile.trunc;
    for (i=0;i<spisok;i++)
        {
           bfile.write ((char * ) &Sklad[i], sizeof(SSklad));          
        }   
        bfile.close();
 
    printf_s ("Записали в бинарный файл!\n\n");
    dialog();
}

Функция вывода на экран BIN файла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
void PrintBIN ()                                                //Вывод на экран бинарного файла
{
    system("CLS");
    ifstream bfile; 
    unsigned int kol = 7;
    int i =0;
    int spisok = 0; 
    bfile.open("base.bin", ios_base::binary);                   // Открыли файл, указав его имя и тип
    bfile.read ((char *) &kol, sizeof(unsigned int));           // ...
    
    //------------Выводим таблицу красиво (в столбик)-------------------------------------
    //-------------Загаловки таблицы
    SetColor( 3, 1);    
    cout << "+------------------------------------------------------------+" << endl;
    SetColor(10, 3);    
    cout << "                                                              " << endl;
    cout << "Тип         Фирма      Модель     Год  Серийный № Сост Рейтинг" << endl;
    cout << "                                                              " << endl;
    //-------------Загаловки таблицы
    
while (! bfile.eof())
{
    
        memset (&Sklad, 0, sizeof (SSklad));        
        bfile.read ((char * ) &Sklad[i], sizeof(SSklad));
        
 
        string tip = Sklad[i].tip;
        int counter = 10-tip.length();
        for (int j=0;j<counter;j++)
        {
            tip=tip+' ';
        }
 
        string firma = Sklad[i].firma;
        counter = 10-firma.length();
        for (int j=0;j<counter;j++)
        {
            firma=firma+' ';
        }
 
        string model = Sklad[i].model;
        counter = 10-model.length();
        for (int j=0;j<counter;j++)
        {
            model=model+' ';
        }
        
        
        SetColor(11, 3);
        cout << tip << "  " ;
        cout << firma << " " ;
        cout << model << " " ;
        cout << Sklad[i].god << " " ;
        cout << Sklad[i].serial << " " ;
        cout << Sklad[i].inventar << " " ;
        cout << Sklad[i].sost << " " ;
        cout << Sklad[i].sred << "    " <<endl ;
        SetColor(10, 3);
        cout << "                                                              " <<endl;                                                      
        
        if (bfile.eof()==1) {cout << "Конец файла (удачно)                            " << endl;};
        
}
    bfile.close();
    SetColor( 3, 1);    
    cout << "+------------------------------------------------------------+" << endl;   
    
    dialog();
}
Файлы (чтение/запись)

текстовик_и_бинарн.rar

Буду благодарен за любые мысли по этому вопросу.. а то завис на два дня уже над этой проблемой
ЗЫ: Пишу на MVS2010
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
albannikov
 Аватар для albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 75
31.10.2013, 07:03  [ТС]     Файлы (чтение/запись) #2
извиняюсь, "Функция записи из TXT в BIN" ... в пятой строке случайно не дописал.. у меня там так написано:
C++
1
    bfile.open("base.bin", ios_base::ate);
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.10.2013, 16:29     Файлы (чтение/запись) #3
Так попробуйте:
C++
1
2
3
4
5
6
7
8
9
10
    while (true)                      
    {
        infile >> Sklad[i].tip >> Sklad[i].firma >> Sklad[i].model;
        infile >> Sklad[i].god >> Sklad[i].serial >> Sklad[i].inventar;
        infile >> Sklad[i].sost;
        infile >> Sklad[i].sred;
        if (infile.eof()) break;
        i++;
        spisok++;
    }
Добавлено через 2 минуты
Цитата Сообщение от albannikov Посмотреть сообщение
sizeof(SSklad));
SSklad - это что?
albannikov
 Аватар для albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 75
31.10.2013, 19:15  [ТС]     Файлы (чтение/запись) #4
Цитата Сообщение от alsav22 Посмотреть сообщение
SSklad - это что?
извиняюсь, что не сразу не написал.. это структура такая

C++
1
2
3
4
5
6
7
8
struct SSklad           // Структура "СКЛАД"
{
    char tip[50];           // Тип устройства
    char firma[50];         // Фирма
    char model[50];         // Модель
    char sost[4];           // Состояние
    int god, serial, inventar;      // Год выпуска, серийный, инвентарный номер
    float sred;         // Рейтинг товара
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
31.10.2013, 19:22     Файлы (чтение/запись) #5
Предположительно, буффер, в котором хранится информация в цикле до последней строки заполнялся полностью, а последняя строка например меньше чем буффер, т.к. возможно вы не написали длину последней строки, то и передаёт на запись инфу из буфера, где последние не используемые символы нулями заполняются...
Извини помочь не могу, т.к. я лично использую Си'шную функцию fopen и fputs, а по данному методу не знаю как действовать чтоб передавать для записи число символов.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.10.2013, 20:21     Файлы (чтение/запись) #6
Цитата Сообщение от albannikov Посмотреть сообщение
извиняюсь, что не сразу не написал.. это структура такая
Понятно. Код попробовали?

Добавлено через 5 минут
И в функции PrintBIN (), признак конца файла, тоже нужно сразу после чтения проверять:
C++
1
2
3
4
5
6
7
8
9
10
11
while (true)
{
    
        memset (&Sklad, 0, sizeof (SSklad));        
        bfile.read ((char * ) &Sklad[i], sizeof(SSklad));
        if (bfile.eof())
        {
               cout << "Конец файла (удачно)" << endl;
               break;
         }
        ...
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
31.10.2013, 20:28     Файлы (чтение/запись) #7
конец бинарного файла можно обнаружить еще так:
C++
1
2
3
4
while(bfile.peek() != EOF)
{
    ...
}
albannikov
 Аватар для albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 75
01.11.2013, 07:15  [ТС]     Файлы (чтение/запись) #8
Цитата Сообщение от alsav22 Посмотреть сообщение
нужно сразу после чтения проверять
Спасибо большущее, помогла проверка в начале цикла.
Сейчас другая трудность возникла... содержимое файла копирую во временный файл (tmp.bin)...добавляю новую запись в начало файла (base.bin).. добавляет нормально.. затем из временного файла дописываю всё обратно.. в итоге выводит на экран кракозябры после первой записи... где можно проблему поискать , подскажите пжалста...
запилил временный файл и основоной (после добавления 1 элемента):
временный и главный.rar

Вот краказябры:
Файлы (чтение/запись)
Файлы (чтение/запись)

Вот такая у меня функция :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
void AddBin()                                                                   // Запись в BIN новой строки
{   
    system("CLS");  
    
    SNew New;
 
    unsigned int kol = KOL;
    int i = 0;  
 
 
    SetColor(14,0);
    cout << "Сейчас запишем :-)" << endl;   
 
    
    
    std::ifstream ifs("base.bin", std::ios::binary);    // На чтение нашего бинарника
    std::ofstream ofs("tmp.bin", std::ios::binary);     // На запись во временный файл, если файл не пустой, то зачистили
    cout << "Очистили временный" << endl; 
    _getch();
    std::copy((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>(), std::ostreambuf_iterator<char>(ofs));
    // Забрали из BASE в TMP
    ifs.close(); // Закрыли
    ofs.close(); // Закрыли
    
    cout << "Забрали из BASE в TMP" << endl; 
    _getch();
    
    
 
    ofstream bfile;
    bfile.open("base.bin", ios_base::binary);       // Открыли файл, указав его имя и тип
    bfile.trunc;
    
    cout << "Очистили BASE" << endl; 
    _getch();
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    cout << "Тип? :         ";
    cin >> New.tip;
 
    cout << "Фирма? :       ";
    cin >> New.firma;
 
    cout << "Модель? :      ";
    cin >> New.model;
 
    cout << "Год? :         ";
    cin >> New.god;
 
    cout << "Серийный номер? :  ";
    cin >> New.serial;
 
    cout << "Инвентарный номер? :   ";
    cin >> New.inventar;
 
    cout << "Состояние (норм)? :    ";
    cin >> New.sost;
 
    cout << "Рейтинг? :     ";
    cin >> New.sred;
 
    bfile.write ((char *) &kol, sizeof(unsigned int));      
    bfile.write ((char * ) &New, sizeof(SNew));         
    bfile.close();  
    // Новая запись в BIN !>
    cout << "Создали одну запись в BASE" << endl; 
    _getch();
 
 
    std::ifstream nifs("tmp.bin", std::ios::binary);    // На чтение нашего бинарника
    std::ofstream nofs("base.bin", std::ios::app);      // На запись во временный файл, если файл не пустой, то зачистили
    std::copy((std::istreambuf_iterator<char>(nifs)), std::istreambuf_iterator<char>(), std::ostreambuf_iterator<char>(nofs));
    // Забрали из TMP в BASE    
    nifs.close(); // Закрыли
    nofs.close(); // Закрыли
 
    cout << "Забрали из TMP в BASE" << endl; 
    _getch();
 
 
 
    dialog();   
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.11.2013, 18:34     Файлы (чтение/запись) #9
Цитата Сообщение от albannikov Посмотреть сообщение
помогла проверка в начале цикла.
Код, из 3 поста, тоже нужно применять. В вашем коде, после чтения из base.txt, неправильное значение количества структур в файле получается (spisok). Происходит из-за того, что в первой строке цикла while() будет считан конец файла, но выход из цикла будет после того, как spisok увеличится на единицу.

Добавлено через 18 минут
Если, вместо использования итераторов, попробовать обычное бинарное чтение/запись?

Добавлено через 9 минут
И здесь:
C++
1
 std::ofstream nofs("base.bin", std::ios::app);
режим записи измените на бинарный.
albannikov
 Аватар для albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 75
06.11.2013, 07:11  [ТС]     Файлы (чтение/запись) #10
Цитата Сообщение от alsav22 Посмотреть сообщение
вместо использования итераторов, попробовать обычное бинарное чтение/запись
Поясните пожалуйста, что имеете ввиду ? не понял
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2013, 08:07     Файлы (чтение/запись)
Еще ссылки по теме:

Запись/чтение структур (файлы) + разница между FILE * и <fstream> C++
C++ Длинная арифметика(чтение и запись в файлы)
[Файлы] Запись-чтение-запись. Почему не прокатывает? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
newbie666
Заблокирован
06.11.2013, 08:07     Файлы (чтение/запись) #11
Цитата Сообщение от alsav22 Посмотреть сообщение
std::ofstream nofs("base.bin", std::ios::app);
вместо этого написать:
C++
1
std::ofstream nofs("base.bin", std::ios::binary);
и читать и писать в файл при помощи write / read функций файлового потока
Yandex
Объявления
06.11.2013, 08:07     Файлы (чтение/запись)
Ответ Создать тему
Опции темы

Текущее время: 03:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru