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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> бинарный файл, запись и чтение 3 char и 1 int 
V
    Опции темы
Dikey
Дата 23.10.2009, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 6.3.2008
Где: Украина г.Изюм

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



Столкнулся с такой проблемой:
Написал программу чтения/записи в бинарный файл, записывает все значения (марка,модель,год,пробег) нормально,но читает только первую запись которая писалась под 0 смещением,потом при чтении хоть 10 смещение вводи все равно выдает запись по первому.
Пересмотрел весь код ничего подозрительного не нашел,помогите решить проблему.

Код

#include "stdafx.h"
#include "iostream"
#include "fstream"
using namespace std;
int get_int(int default_value);
char model[21];
char mark[21];
char year[6];
int n,km,mnu;

int main(){
    
    char filename[81];
    cout<<"Enter filename: ";
    cin.getline(filename,80);
    fstream fbin(filename,ios::binary | ios::in | ios::out);
    if (!fbin){
        cout<<"Could not open file "<<filename;
        return -1;
    }
    while (1){
        int recsize=sizeof(model)+sizeof(mark)+sizeof(year)+sizeof(km);
        cout<<"1-Read/2-Write/ENTER-Exit: ";
        mnu=get_int(3);
        if (mnu==1){

            cout<<"Enter file read number: ";
            n=get_int(0);
            fbin.seekp(n*recsize);
            fbin.read(mark,20);
            fbin.read(model,20);
            fbin.read(year,5);
            fbin.read(reinterpret_cast<char*>(&km),sizeof(int));
            fbin.close();
            cout<<mark<<endl;
            cout<<model<<endl;
            cout<<year<<endl;
            cout<<km<<endl;
        }else if(mnu==2){
            cout<<"Enter file read number: ";
            n=get_int(0);
            fbin.seekp(n*recsize);
            cout<<"Enter mark car: ";
            cin.getline(mark,20);
            cout<<"Enter model car: ";
            cin.getline(model,20);
            cout<<"Enter year of the assembly: ";
            cin.getline(year,5);
            cout<<"Enter mileage: ";
            km=get_int(1000);
            fbin.write(mark,20);
            fbin.write(model,20);
            fbin.write(year,5);
            fbin.write(reinterpret_cast<char*>(&km),sizeof(int));
        }else break;
    }
    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);
}

PM MAIL WWW ICQ Skype   Вверх
Anikmar
Дата 23.10.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



а get_int то что нужно возвращает?
а в файле все записи есть?
а после того как считали из файла и файл закрыли перед следующим чтением кто-нибудь его открывает?
PM MAIL ICQ   Вверх
niXman
Дата 23.10.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Dikey @  23.10.2009,  16:21 Найти цитируемый пост)
fbin.seekp(n*recsize);

Должно быть:
Код

fbin.seekg(n*recsize);


Добавлено через 54 секунды
Это там где "Read"
Цитата

if (mnu==1){

--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
Dikey
Дата 23.10.2009, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 6.3.2008
Где: Украина г.Изюм

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



Нет,там seekp пробовал seekg тот же результат что и с первым.
get_int возвращает число типа int а если не введено ничего возвращает то что в нее передали.
Вот по отдельность запись и чтение работает отлично,а вместе чет не то,что за ошибка такая,немогу разобрать.


PM MAIL WWW ICQ Skype   Вверх
niXman
Дата 23.10.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
Dikey
Дата 23.10.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 6.3.2008
Где: Украина г.Изюм

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



спс за ссылки но ничего я там понять не смог,я пробовал seekg но программа все равно работает также как я описал в первом посте.
я использую vs2008.
PM MAIL WWW ICQ Skype   Вверх
niXman
Дата 23.10.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Предложение не решающее проблему, но все же: Объедени все поля в структуру, проще читать и писать в файл.
Код

struct avto {
   char model[21];
   char mark[21];
   char year[6];
   int n,km,mnu;
};
...
avto avtomobil;
...
fbin.write(reinterpret_cast<char*>(&avtomobil));

--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
Dikey
Дата 23.10.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 6.3.2008
Где: Украина г.Изюм

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



Цитата

Предложение не решающее проблему, но все же: Объедени все поля в структуру, проще читать и писать в файл.

так как же решить проблему, ведь каждый использует бинарные файлы,решение должно быть.
PM MAIL WWW ICQ Skype   Вверх
zim22
Дата 24.10.2009, 10:17 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(Dikey @  23.10.2009,  22:50 Найти цитируемый пост)
решение должно быть.

smile
Код

#include <fstream>
#include <iostream>
#include <iomanip>

struct Car {
  friend std::ostream &operator<<(std::ostream &out, const Car &car);
  friend std::istream &operator>>(std::istream &in, Car &car);
private:
  char brand[255];
  char model[255];
  int year;
  int mileage;
};

std::ostream &operator<<(std::ostream &out, const Car &car) {
  out << "Brand: " << car.brand << ' ' 
      << "Model: " << car.model << ' '
      << "Year: "  << car.year << ' ' 
      << "Mileage: " << car.mileage;
  return out;
}

std::istream &operator>>(std::istream &in, Car &car) {
  in >> std::setw(255) >> car.brand >> car.model >> car.year >> car.mileage;
  return in;
}

int GetRecNumber() {
  std::cout << "Enter record number: ";  
  int rec_number;
  std::cin >> rec_number;
  return rec_number;
}

void ReadData(std::fstream &file) {    
  file.seekg(GetRecNumber() * sizeof(Car));
  
  Car car;
  file.read((char*)&car, sizeof(Car));
  std::cout << car << std::endl;
}

void WriteData(std::fstream &file) {
  file.seekp(GetRecNumber() * sizeof(Car));

  Car car;
  std::cin >> car;
  file.write((char*)&car, sizeof(Car));  
}

int main() {
  std::fstream file("car.txt", std::ios_base::in | std::ios_base::out | std::ios_base::binary);
  if (!file) return 1; 

  int choice = 0;
  while (choice != 2) {
    std::cout << "Your choice: (0-2): ";
    std::cin >> choice;

    switch (choice) {
      case 0: ReadData(file); break;
      case 1: WriteData(file); break;
      case 2: 
      default: choice = 2; break;
    }
  }
  file.close();
  return 0;
}


Это сообщение отредактировал(а) zim22 - 24.10.2009, 10:43


--------------------
PM MAIL   Вверх
Dikey
Дата 24.10.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 6.3.2008
Где: Украина г.Изюм

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



спс за подсказки,а моим методом что невозможно???
PM MAIL WWW ICQ Skype   Вверх
zim22
Дата 24.10.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(Dikey @  24.10.2009,  10:48 Найти цитируемый пост)
спс за подсказки

это не подсказки. это твоя решённая задача.
Цитата(Dikey @  24.10.2009,  10:48 Найти цитируемый пост)
,а моим методом что невозможно???

метод - набросать весь код в одну непонятную кучу?


--------------------
PM MAIL   Вверх
Dikey
Дата 24.10.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 6.3.2008
Где: Украина г.Изюм

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



был бы очень благодарен,если б вы объяснили в чем проблема,почему не работает,что куча кода это я понял,а что в этой куче вызывает некорректную работу?
PM MAIL WWW ICQ Skype   Вверх
bsa
Дата 26.10.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Dikey
Начнем с того, что тебе правильно сказали про seekp. seekp - это указатель записи (put), а seekg - чтения (get). Т.е. использование seekp перед чтением скорее всего говорит об ошибке.
Код
int recsize=sizeof(model)+sizeof(mark)+sizeof(year)+sizeof(km);
 задает размер записи равным 21+21+6+4 = 52, а читаешь/пишешь ты по 20+20+6+4 = 50 байт.
Ты прочитал 20 байт из 21 в model, а где завершающий символ '\0'?

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 6.3.2008
Где: Украина г.Изюм

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



bsa, спасибо,все исправил как вы мне описали,теперь программа работает.
По поводу seekp .
Вот решение одного из упражнений,работает на 100% и применяется seekp и при чтении, и при записи.
Код

#include <iostream>
#include <fstream>
using namespace std;

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

int main() {
    char filename[81];
    int n;
    int menu;   // Integer used to select a menu command.

    int recsize =  sizeof(name) + sizeof(int);
    

    cout << "Enter file name: ";
    cin.getline(filename, 80);

    // Open file for binary read-write access.

    fstream  fbin(filename, ios::binary | ios::in | ios::out);
    if (!fbin) {
        cout << "Could not open file " << filename;
        return -1;
    }

    while(1) {

        // Prompt for a command and then get a menu number.

        cout << "Enter a choice: 1. Write Record, 2. Read Record, 3. Exit. ";
        menu = get_int(3);

        if (menu == 1) {                       // Menu choice #1. Write

        cout << "Enter a record number: ";    // Get record #
        n = get_int(0);
            fbin.seekp(n * recsize);

            cout << "Enter name: ";               // Get data to write
            cin.getline(name, 19);
            cout << "Enter age: ";
            age = get_int(0);

            // Write data to the file.
 
            fbin.write(name, 20);                 // Write to file
            fbin.write(reinterpret_cast<char*>(&age), sizeof(int));

        } else if (menu == 2) {               // Menu choice #2. Read

        cout << "Enter a record number: ";      // Get record #
            n = get_int(0);
            fbin.seekp(n * recsize);

            // Read data from the file.

            fbin.read(name, 20);                    // Read data from file
            fbin.read(reinterpret_cast<char*>(&age), sizeof(int));

            // Display the data and close.
    
            cout << "The name is: " << name << endl;  // Display the data
            cout << "The age is: " << age << endl;

         } else                               // Other menu choices: Exit.
            break;
    }
    fbin.close();
    return 0;
}

// Get integer function
// Get an integer from keyboard; return default
//  value if user enters 0-length string.
//
int get_int(int default_value) {
    char s[81];

    cin.getline(s, 80);
    if (strlen(s) == 0)
         return default_value;
    return atoi(s);
}


PM MAIL WWW ICQ Skype   Вверх
bsa
Дата 26.10.2009, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



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

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

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

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

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


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

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


 




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


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

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