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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Интерпретация данных для записи в файл 
V
    Опции темы
Night_xxx
Дата 30.3.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.1.2007
Где: Набережные Челны

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



Так у даны два типа данных char и int. Для записи в файд нужно интерпритировать все данные в тип char* . Значит надо интерпритировать тип int в char*. Я сделал, но у меня что-то неверно с интерпритайией, т.е. вводим:
Номер-------  0
Name--------  petr
Age----------- 18

И в файл записывается:
petr                0               //Т.е. тип int я неправильно интерпритировал

Подскажите как надо плиз


Код

#include "stdafx.h"
#include <iostream.h>
#include "iomanip.h"
#include <stdio.h>
#include <fstream.h>

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

int main() 
{
    char filename[81];
    int n;
    char ch='y';
    
    int recsize=sizeof(name)+sizeof(int);
    
    printf("Vvedite imya faila dla zapisi: ");
    gets(filename);
    
    fstream fbin(filename, ios::binary| ios::in| ios::out);
    if(!fbin)
    {
        cout<<"\aFail "<<filename<<" ne bil uspershno otkrit";
        return -1;
    }
    
    while(ch=='y')
    {
        cout<<"Vvedite nomer kuda budem vpicivati dannie: "; 
        cin>>n;
        
        printf("Enter name: ");
        gets(name);
        printf("Enter age: ");
        cin>>age;
        
        fbin.seekp(n*recsize);
        fbin.write(name,20);
        fbin.write(reinterpret_cast<char*>(&age),sizeof(int));
        cout<<"Prodoljim? (y/n)"; cin>>ch;
    }
    
    fbin.close();
    return 0;
}

PM MAIL   Вверх
zkv
Дата 30.3.2007, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



почему оператор << не используете?
Код

fbin<<age;
 
ну если все таки по вашему:
Код

        ostrstream str;
        str<<age<<'\0';
        fbin.write(str.str(), strlen(str.str() ) );

также можно использовать itoa() или sprintf()

а reinterpret_cast<char*>(&age) просто говорит о том, чтобы рассматривать данные, лежащие по адресу переменной age как массив символов, что не является конвертацией
PM MAIL   Вверх
Night_xxx
Дата 30.3.2007, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.1.2007
Где: Набережные Челны

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



Так напигите мне полностью рабочую программу, а то я че то не догоняю. 
Я написал как было написано в книге, если что-то неправильно так исправьте мне чтобы все работало
PM MAIL   Вверх
Night_xxx
Дата 30.3.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.1.2007
Где: Набережные Челны

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



Так что никто не может написать мне чтоб все правильно записывало???????????!!!!!!!
PM MAIL   Вверх
Xenon
Дата 30.3.2007, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



По идее так:
Код

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

int main() 
{
    char filename[81];
    int n;
    char ch = 'y';
    
    int recsize=sizeof(name)*sizeof(char)+sizeof(int);
    
    printf("Vvedite imya faila dla zapisi: ");
    gets(filename);
    
    fstream fbin(filename, ios::binary | ios::in | ios::out);
    if(!fbin)
    {
        cout << "\aFail " << filename << " ne bil uspershno otkrit";
        return -1;
    }
    
    while(ch == 'y')
    {
        cout << "Vvedite nomer kuda budem vpicivati dannie: "; 
        cin >> n;
        
        printf("Enter name: ");
        gets(name);
        printf("Enter age: ");
        cin >> age;
        
        fbin.seekg(n*recsize);
        fbin.write(name,sizeof(char)*20);
        fbin.write(reinterpret_cast<char*>(&age),sizeof(int));
        cout << "Prodoljim? (y/n)"; cin >> ch;
    }
    fbin.close();
    return 0;
}




--------------------
user posted image  
PM MAIL   Вверх
Night_xxx
Дата 30.3.2007, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.1.2007
Где: Набережные Челны

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



Xenon,  все осталось так как есть, например вводим:
Введите номер записи -------- 0
Введите имя --------------------- name
Введите age --------------------- 18

И в итоге в файле видим следующее:
name                0       ////////////////////и так далее всегда на месте где должно было быть значение age выходит 0 

Так все тип int почему неправильно интерпретируется....
Вопрос все ещё открыт.  Что же я делаю не так???
PM MAIL   Вверх
Xenon
Дата 30.3.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Night_xxx, Ты как считываешь? Код в студию. Если ты открываешь файл в текстовом в редакторе, то ... да ...


--------------------
user posted image  
PM MAIL   Вверх
Night_xxx
Дата 30.3.2007, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.1.2007
Где: Набережные Челны

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



А какая разница где открывать , главное что все таки в них записывается?
Так что 
Xenon,  у тебя так как надо выходит в редакторе (куда записывали age записано нужное значение)?


Так если записывали значение с типом char все ведь правильно записывается. Поясни подробнее в чем дело в моей программе(почему всегда на месте куда записывали age находятся нули) . Че то я нихрена не понял

PM MAIL   Вверх
zkv
Дата 30.3.2007, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Цитата(Night_xxx @  30.3.2007,  20:45 Найти цитируемый пост)

Так все тип int почему неправильно интерпретируется....

нет, как раз интерпретируется он правильно, как массив байтов, может вы хотите преобразовать из int в char? Но в этом случае ваш алгоритм не будет работать, или его придется немного модифицировать.
PM MAIL   Вверх
Night_xxx
Дата 30.3.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.1.2007
Где: Набережные Челны

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



Да я хочу тип int преобразовать в char.  И как правильно модифицировать. Напишите полностью рабочую программу, чтобы работала как надо. 
PM MAIL   Вверх
Xenon
Дата 30.3.2007, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Поскольку char рассматривается как char при записи, то в файле его ты видишь нормально, а int когда рассматриваешь как char и пишешь в файл, то сам понимаешь, что фиг знает как нарезаный int может выглядеть там как угодно. Тебе нужно все вернуть назад, то есть не в редакторе читать, а в программе читать. Ты же бинарно пишешь.
Код

fbin.read(name,sizeof(char)*20);
fbin.read(reinterpret_cast<char*>(&age),sizeof(int));



--------------------
user posted image  
PM MAIL   Вверх
Dov
Дата 30.3.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(Night_xxx @  30.3.2007,  21:24 Найти цитируемый пост)
Напишите полностью рабочую программу, чтобы работала как надо. 


Night_xxx, если ты хочешь, что бы тебе помогли, то посиди минут 10, подумай спокойно, сформулируй задачу, ибо я, например, уже часа 2 наблюдаю за твоей перепиской и до сих пор ни фуя не понял: 
1. зачем ты пишешь в бинарный  файл, а не в текстовый?
2. зачем int в char переводить?
3. зачем printf, gets, cout, cin и т.д. всё вместе перемешано?
Ну, и так далее...


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Night_xxx
  Дата 30.3.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.1.2007
Где: Набережные Челны

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



Так в начале отвечу 
Dov,  
1)пишу в бинарный файл, т.к. потом мне будет легче искать там нужные значения (а тут я только выложил непонятную мне часть програмки);
2)перевожу int в char так как у меня есть ещё тип int в условии (для поля age) , и я прочитал в книге чтобы привести тип int к типу char необходимо использовать оператор reinterpret<char*>
А вообще это приведение необходимо так как при работе с двоичными файлами нужен только тип char*
3)А что в этом такого!!!!!!!!!!!!!!!!!


Ну теперь ладно видимо так кашу не сваришь, вообщем я продвинулся дальше и теперь изложу следующее событие, вызывающее у меня непонимание:

Вначале программа:

Код

#include "stdafx.h"
#include <iostream.h>
#include "iomanip.h"
#include <fstream.h>
#include "string.h"
#include "stdlib.h"
#include "conio.h"

void zapici();
void chtenie();
void menu();

    char filename[81];
char name[20];
char age[2];
int recsize=sizeof(name)+sizeof(age);

int main() {
    
    char ch1='y', ch2='y';
        
    printf("Vvedite imya faila dla zapisi: ");
    gets(filename);

    fstream fbin(filename, ios::binary| ios::in| ios::out);
    if(!fbin)
    {
        cout<<"\aFail "<<filename<<" ne bil uspershno otkrit";
        return -1;
    }

    menu();

    fbin.close();
    return 0;
}

void menu()
{
    system ("cls");
    int k;
cout<<"\n\n\t\t*************MENU**************";
    cout<<"\n\n\t\tZapicati v fail   ------ PRESS 1"; 
    cout<<"\n\n\t\tProchitati zapici ------ PRESS 2"; 
    cout<<"\n\n\t\tViiti iz programmi------ PRESS 3";
    cout<<"\n\n\t\tVash vibor  ";cin>>k;
    switch(k)
    {
    case 1: zapici();
    case 2: chtenie();
    case 3: exit(0);
    }
}

void zapici()
{
    fstream fbin(filename, ios::binary| ios::in| ios::out);
    char ch1='y';
int n;
while(ch1=='y')
    {
        cout<<"\nVvedite nomer dla zapici "; cin>>n;
        printf("Name - "); gets(name);
        printf("Age - "); cin>>age;
        fbin.seekp(n*recsize);
        fbin.write(name,20);
        fbin.write(age,2);
        cout<<"Prodoljiti? (y/n)"; cin>>ch1;
        if(ch1!='y') {menu();}
    }
}

void chtenie()
{
    fstream fbin(filename, ios::binary| ios::in| ios::out);
    char ch2='y';
    int n;

    while(ch2=='y'){
    cout<<"\nVvedite nomer otkuda budem 4itati dannnie: "; 
    cin>>n;
    fbin.seekp(n*recsize);

    fbin.read(name,20);
    fbin.read(age,2);
    cout<<"Name - "<<name<<endl;
    cout<<"Age - "<<age<<endl;
    cout<<"Prodoljim? (y/n)"; cin>>ch2;
    if(ch2!='y') {menu();}
    }
}



Теперь что мне непонятно:
Вводим:
Имя файла ----------  fail
Вначале в меню выбираем записать значения (1)
Номер записи--------- 0
Name-------------------- name
Age---------------------- 13
Продолжаем
Номер записи--------- 1
Name-------------------- nameeeee
Age---------------------- 15
Продолжаем
Номер записи--------- 2
Name-------------------- nameeeeeeeeee
Age---------------------- 18
Выходим в меню
Выбираем чтение
Прочитать запись ----0
Все правильно вывелось
Прочитать запись-----1
Все правильно вывелось
Прочитать запись-----2
И как ни странно я не нахожу тут своей последней записи, вместо этого выходит запись 1.
Вообщем последняя запись не записывается, а почему?????????? Ответьте мне на этот вопрос ответом, а ни приветом



PM MAIL   Вверх
Xenon
Дата 30.3.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



У тебя вообще сплошная жесть, а не код. Мешать стиль - плохой тон. Ты либо в С++ пиши, либо уж в С, а то такую мешанину читать не очень удобно.
Потом, ты определяешь новую переменную fstream fbin(filename, ios::binary| ios::in| ios::out); и открываешь файл, затем в zapici() ты опять открываешь тот же файл. Зачем создавать переменную на чтение/запись, если ты либо читаешь, либо пишешь ...
Тут может быть что угодно, вплоть до того, что у тебя файл старый с данными уже записаными перезаписынами вкривь и вкось.
PS. Что за цикл switch без break`ов?

Это сообщение отредактировал(а) Xenon - 30.3.2007, 22:54


--------------------
user posted image  
PM MAIL   Вверх
Night_xxx
  Дата 30.3.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 7.1.2007
Где: Набережные Челны

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



Да теперь я понял что ты 
Xenon,  объяснил мне насчет приведения типа int в char. С этим все ясно.

Но как и с первым случаем когда я age использую как тип int так и по-другому, когда я исрользую age в типе char
При записи последняя запись не записывается !!!!!!!! 
Ну напишите мне мой последний выложенный вариант правильно, чтобы все записывалось.
Ну а насчет смешения стилей я ни думал что как-то может повлиять на правильность программы.
Ну все таки исправьте мой последний код правильно или укажите точно на мою ошибку.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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