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

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

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

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

31.10.2013, 06:54. Просмотров 500. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2013, 06:54     Файлы (чтение/запись)
Посмотрите здесь:

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

двоичные файлы,чтение\запись - C++
задача,если упрощенно, записать в новый двоичный файл данные исходного файла в блоках по ,допустим, 20 байт. брал целочисленный массив...

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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);
alsav22
5416 / 4812 / 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
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;         // Рейтинг товара
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
31.10.2013, 19:22     Файлы (чтение/запись) #5
Предположительно, буффер, в котором хранится информация в цикле до последней строки заполнялся полностью, а последняя строка например меньше чем буффер, т.к. возможно вы не написали длину последней строки, то и передаёт на запись инфу из буфера, где последние не используемые символы нулями заполняются...
Извини помочь не могу, т.к. я лично использую Си'шную функцию fopen и fputs, а по данному методу не знаю как действовать чтоб передавать для записи число символов.
alsav22
5416 / 4812 / 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
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();   
}
alsav22
5416 / 4812 / 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
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 90
06.11.2013, 07:11  [ТС]     Файлы (чтение/запись) #10
Цитата Сообщение от alsav22 Посмотреть сообщение
вместо использования итераторов, попробовать обычное бинарное чтение/запись
Поясните пожалуйста, что имеете ввиду ? не понял
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2013, 08:07     Файлы (чтение/запись)
Еще ссылки по теме:

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

Чтение и запись - C++
Здравствуйте! Писал программку по чтению одного файла и записи данных первого во второй с измененным содержимым. Смысл таков - есть первый...

Чтение/запись - C++
какая буква в fopen, открывает файл на одновременное чтение/запись, причем если файл существует, то не стирает его

запись\чтение из файла - C++
У меня несколько вопросов по поводу запись\чтение из файла Как это вообще работает?) Чтобы потом читать из файла надо забивать каждое...

Чтение и запись в файл - C++
Подскажите, как сделать так, чтобы информация считывалась с текстового файла, а не с консоли #include &quot;map.h&quot; void main(void) { ...


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

Или воспользуйтесь поиском по форуму:
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     Файлы (чтение/запись)
Ответ Создать тему
Опции темы

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