Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Некорректно сохраняются числа при записи в txt 
:(
    Опции темы
marknew
Дата 3.2.2017, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Здравствуйте, господа, имею вопрос! 
Почему после сохранения в файле (test.txt), вместо возраста (любое число int формата), в итоге я вижу непонятный символ?  Как это можно исправить, чтобы числа сохранялись в нормальном удобочитаемом виде? При компиляции никаких ошибок и предупреждений не возникает, использую Visual C++ 2010 Express. 

Код

#include <iostream>
#include <fstream>
using std::cin;
using std::ios;
using std::cout;
using std::endl;
using std::fstream;

int get_int(int default_value);
char name[20];

int main() {
    char filename[81];
    int n;
    int age;
    int recsize = sizeof(name) + sizeof(int);
    system("chcp 1251 > nul");
    
    cout << "Enter file name: ";
    cin.getline(filename, 80);

    fstream fbin(filename, ios::binary | ios::in | ios::out);

    if (!fbin) {
        cout << "Could not open file " << filename;
        cout << endl << endl;
        return -1;
    }

    cout <<"Enter file record number: ";
    n = get_int(0);

    cout << "Enter name: ";
    cin.getline(name, 19);

    cout << "Enter age: ";
    age = get_int(0);

    fbin.seekp(n * recsize);
    fbin.write(name, 20);
    fbin.write(reinterpret_cast<char*>(&age), sizeof(int));
    fbin.close();
    
    cout << endl;
    system("pause");
    return 0;
}

int get_int(int default_value) {
    char s[81];
    cin.getline(s,80);
    if (strlen(s) == 0)
        return default_value;
    return atoi(s);
}


Это сообщение отредактировал(а) marknew - 3.2.2017, 23:44
PM MAIL   Вверх
baldman88
Дата 4.2.2017, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



Ничего удивительного. Подумайте что делается в этой строке:
Код

fbin.write(reinterpret_cast<char*>(&age), sizeof(int));
Вы берете адрес переменной age (даже не ее значение), приводите его к указателю на char и записываете значение этого указателя.
Посмотрите на функцию itoa. Либо, если используете с++11, можно воспользоваться функцией to_string.
PM MAIL   Вверх
marknew
Дата 4.2.2017, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Цитата(baldman88 @ 4.2.2017,  11:32)
Посмотрите на функцию itoa. Либо, если используете с++11, можно воспользоваться функцией to_string.

Спасибо за наводку на to_string! А насчет itoa, не совсем понятно, если не сложно, напишите пожалуйста, как правильно задействовать эту функцию в контексте моего примера?
PM MAIL   Вверх
baldman88
Дата 4.2.2017, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



С itoa я погорячился. Она не везде есть. Проще sprintf использовать
Код

char age_str[4];
int age_str_size = sprintf(age_str, "%d", age);
fbin.write(age_str, age_str_size);
Не забудьте для ее использования подключить stdio.h
PM MAIL   Вверх
marknew
Дата 4.2.2017, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Цитата(baldman88 @ 4.2.2017,  18:10)
Проще sprintf использовать

Да, действительно проще. А чтобы компилятор не выдавал никаких warnings можно использовать sprintf_s.  Еще раз, спасибо за помощь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1139 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.