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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 90
#1

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

31.10.2013, 06:54. Просмотров 508. Ответов 10
Метки нет (Все метки)

Привет всем.
Уважаемые программисты! Второй день мучаюсь.. помогите плиз..
Забираю из текстового файла информацию и передаю её в бинарный файл..
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
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2013, 06:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Файлы (чтение/запись) (C++):

[Файлы] Запись-чтение-запись. Почему не прокатывает? - C++
Сначала записываю в файл &quot;а&quot; запись &quot;makulatura&quot;, потом читаю ее в строку h. Все ок. Но потом когда открываю файл &quot;a&quot; опять для записи с...

Чтение и запись в файлы - C++
Пусть файл с произвольным именем содержит 10 целых чисел. Написать программу fileprocessor, которая выполняет следующие действия: 1....

Запись и чтение, файлы - C++
Помогите пожалуйста, не могу понять записывается ли в файл что-то и правильно ли я делаю? код собран по кусочкам, из интернета, привожу две...

Бинарные файлы, чтение и запись - C++
Доброго времени суток. Подскажите пожалуйста, как организовать побайтовое чтение и запись данных в бинарный файл. Правильно ли будет...

Чтение и запись в текстовые файлы. - C++
Доброй ночи всем. Не очень понимаю в си++,щас вот пытаюсь начинать учиться. Может поможет кто. Задание дали такое : Текстовый файл...

Длинная арифметика(чтение и запись в файлы) - C++
Во время выполнения программа вылетает с выдачей ошибки &quot;Необработанное исключение по адресу 0x000B966F в longMult.exe: 0xC0000005:...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 90
31.10.2013, 07:03  [ТС] #2
извиняюсь, "Функция записи из TXT в BIN" ... в пятой строке случайно не дописал.. у меня там так написано:
C++
1
    bfile.open("base.bin", ios_base::ate);
0
alsav22
5419 / 4815 / 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 - это что?
1
albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 90
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;         // Рейтинг товара
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
31.10.2013, 19:22 #5
Предположительно, буффер, в котором хранится информация в цикле до последней строки заполнялся полностью, а последняя строка например меньше чем буффер, т.к. возможно вы не написали длину последней строки, то и передаёт на запись инфу из буфера, где последние не используемые символы нулями заполняются...
Извини помочь не могу, т.к. я лично использую Си'шную функцию fopen и fputs, а по данному методу не знаю как действовать чтоб передавать для записи число символов.
1
alsav22
5419 / 4815 / 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;
         }
        ...
1
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
31.10.2013, 20:28 #7
конец бинарного файла можно обнаружить еще так:
C++
1
2
3
4
while(bfile.peek() != EOF)
{
    ...
}
1
albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 90
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();   
}
0
alsav22
5419 / 4815 / 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);
режим записи измените на бинарный.
1
albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 90
06.11.2013, 07:11  [ТС] #10
Цитата Сообщение от alsav22 Посмотреть сообщение
вместо использования итераторов, попробовать обычное бинарное чтение/запись
Поясните пожалуйста, что имеете ввиду ? не понял
0
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 функций файлового потока
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2013, 08:07
Привет! Вот еще темы с ответами:

fwrite\fread: чтение и запись в бинарные файлы - C++
Добрый день. Пытаюсь разобратся с чтением и записью в бинарные файлы.. в общем обрисую в краце проблему, записываю класс. class tPoint ...

Запись/чтение структур (файлы) + разница между FILE * и <fstream> - C++
Всем привет. Порыскал по форуму, погуглил... Решения есть, но они не ясны (что, почему да как) и не все работают. Однако, я так и не нашёл...

Функции и файлы. Чтение и запись данных в файл. Структура "Ноутбук" - C++
Приветствую. Помогите, пожалуйста, с программой. Для хранения данных о ноутбуках описать структуру вида: struct NOTEBOOK{ struct...

Бинарные файлы. Чтение - C++
Дан бинарный файл, компонентами которого являются массивы действительных чисел. Вычислить для каждого массива число отрицательных...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.11.2013, 08:07
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru