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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Hacker_
11 / 11 / 0
Регистрация: 10.09.2009
Сообщений: 261
#1

Не могу записать переменую и массив в файл - C++

19.10.2009, 13:45. Просмотров 1080. Ответов 7
Метки нет (Все метки)

Здраствуйте, помогите пожалуйста.
Я создал функцию следующего вида:
C++
1
2
3
4
5
6
PutInFile(String FileName,char N,int Y[])
{
        int iFileHandle = FileCreate(FileName);
        FileWrite(iFileHandle,(char*)N, sizeof(N));
        FileClose(iFileHandle);
}
Но переменная N в строчке (char*)N, приравнивается пустому значению, и в файл ничего не записывается. А если убрать (char*), то функция не компилируется, и выдает ошибку E2034 Cannot convert 'int' to 'const void *'. Массив записывает четыре нуля в файл и все, хотя должен записысать 1000 элементов.
Как мне с помощью функции FileWrite, записать значение переменной и массива в файл?
Плюс пытался записать структуру, выдает этуже ошибку. Молжно ли записать значение структуры или обекта в файл с помощью этой функции?
Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alexandoros
227 / 65 / 4
Регистрация: 02.06.2009
Сообщений: 280
19.10.2009, 14:01     Не могу записать переменую и массив в файл #2
Давай по-порядку. Что такое char N, и что такое int Y[] в параметрах ф-ции?
RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
19.10.2009, 14:40     Не могу записать переменую и массив в файл #3
Цитата Сообщение от Hacker_ Посмотреть сообщение
C++
1
2
3
int iFileHandle = FileCreate(FileName); 
FileWrite(iFileHandle,(char*)N, sizeof(N)); 
FileClose(iFileHandle);
конечно ничего не запишется. Ты приводишь обычную переменную к указателю. Попробуй так
C++
1
2
3
int iFileHandle = FileCreate(FileName); 
FileWrite(iFileHandle, &N, sizeof(N)); 
FileClose(iFileHandle);
И все таки объясни значение переменных в функции. Что куда должно записываться и что где должно находиться.
Hacker_
11 / 11 / 0
Регистрация: 10.09.2009
Сообщений: 261
19.10.2009, 15:26  [ТС]     Не могу записать переменую и массив в файл #4
Бошьшое спасибо RazorQ, помогло.
Только я затупил и не написал как я записываю массив:
C++
1
2
3
4
5
6
7
PutInFile(String FileName,char N,int Y[])
{
        int iFileHandle = FileCreate(FileName);
        FileWrite(iFileHandle,&N, sizeof(N));
        FileWrite(iFileHandle, Y, sizeof(Y));
        FileClose(iFileHandle);
}
Массив к сожалению через & не записывается, пишется только 4-е байта.

Вот так я описую массив и вызываю функцию.
C++
1
2
3
4
5
6
7
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int Y[1000];
        for(int i=0;i<1000;i++)
        Y[i]=i;
        PutInFile(SaveDialog1->FileName,1,Osc);
}
Я просто хочу понять принцип записи в файл поэтому беру просто массив переменных и переменную произвольного типа, и передаю их в функцию которая должна записывать их в файл.
RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
19.10.2009, 15:39     Не могу записать переменую и массив в файл #5
Hacker_, а вот здесь у тебя Y - это указатель на первый элемент массива, поэтому записывается только этот первый элемент. Можно попробовать так, но это только в теории, сам не проверял
C++
1
FileWrite(iFileHandle, *Y, sizeof(*Y));
* - указывает на раскрытие указателя
Hacker_
11 / 11 / 0
Регистрация: 10.09.2009
Сообщений: 261
19.10.2009, 15:56  [ТС]     Не могу записать переменую и массив в файл #6
Цитата Сообщение от RazorQ Посмотреть сообщение
C++
1
FileWrite(iFileHandle, *Y, sizeof(*Y));
К сожалению не катит. Выдает сообщение E2034 Cannot convert 'int' to 'const void *'
Что интерестно пробывал делать следующим образом:
C++
1
2
3
4
5
6
7
8
char a[5]={'1','2','3','4','5'};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int iFileHandle = FileCreate("C:\SomeName.txt");
        FileWrite(iFileHandle, a, sizeof(a));
        FileClose(iFileHandle);
 
}
Так работает, запивывает цифры от 1 до 5 без проблем.
Почему же не работает моя функция, я же делаю все аналогичным образом, только использую тип int.
Alexandoros
227 / 65 / 4
Регистрация: 02.06.2009
Сообщений: 280
19.10.2009, 18:47     Не могу записать переменую и массив в файл #7
Цитата Сообщение от Hacker_ Посмотреть сообщение
Почему же не работает моя функция, я же делаю все аналогичным образом, только использую тип int.
Пальцы не накачаны, потому что.



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void PutInFile(String FileName, int N,int Y[])
{
        int iFileHandle = FileCreate(FileName);
        FileWrite(iFileHandle, Y, N * sizeof(Y[0]));
        FileClose(iFileHandle);
}
 
...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int Y[1000];
        for(int i=0;i<1000;i++)
             Y[i]=i;
        PutInFile(SaveDialog1->FileName, 1000, Y);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2009, 17:50     Не могу записать переменую и массив в файл
Еще ссылки по теме:
Записать в файл сгенерированный массив C++
C++ Записать файл по блочно в массив
C++ Как записать динамический массив в файл
C++ Записать массив структур в бинарный файл
C++ Записать массив в текстовый файл построчно

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

Или воспользуйтесь поиском по форуму:
Hacker_
11 / 11 / 0
Регистрация: 10.09.2009
Сообщений: 261
21.10.2009, 17:50  [ТС]     Не могу записать переменую и массив в файл #8
Большое спасибо Alexandoros и RazorQ.
Буду очень благодарен если поможете закончить реализацию класса.
Я написал класс вида:
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
class ReadWrite
{
        //строчка ver
        char* ver;
        //v-Версия
        char v;
        //Число графиков
        char N;
        //L-Длина графика
        long L;
        //Коэфициенты умножения
        char k[];
        //t-общее время записи
        long t;
        //Массив байт графиков
        int Y[][128];
        public:
        ReadWrite();
        //Функция записи в файл
        void PutInFile(String FileName,byte N,long L,long t,int k[],int sizeK,int Y[][8],int sizeY);
        //Функция извлечения записаной информации из файла
        void GetFromFile(String FileName);
 
};
В данном классе есть два метода, первый записывает информацию в файл, вот его реализация:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void ReadWrite::PutInFile(String FileName,byte N,long L,long t,int k[],int sizeK,int Y[][8],int sizeY)
{
        //создаем вайл и получаем его хендл
        int iFileHandle = FileCreate(FileName);
        //Записуем ver в начало файла
        FileWrite(iFileHandle,(char*)ver, sizeof(ver));
        //Записываем номер версии
        FileWrite(iFileHandle,&v, sizeof(v));
        //Записываем число массивов
        FileWrite(iFileHandle,&N, sizeof(N));
        //записываем максимальную длину масива
        FileWrite(iFileHandle,&L, sizeof(L));
        //записываем время записи
        FileWrite(iFileHandle,&t, sizeof(t));
        //записываем массив коэфициентов
        FileWrite(iFileHandle,k, sizeK);
        //сохраняем массив с данными
        FileWrite(iFileHandle,Y, sizeY);
        //закрываю файл
        FileClose(iFileHandle);
 
 
}
Второй метод извлекает информацию из файла, проблема именно в этом методе, он не коректно записывает информацию в переменную:
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
void ReadWrite::GetFromFile(String FileName)
{
  //хендл файла
  int iFileHandle;
  //длина файла
  int iFileLength;
  //прочитаные байты
  int iBytesRead;
  //буфур в который мы будем читать файл
  int *pszBuffer;
 
      //Открываем файл получаем его хендл
      iFileHandle = FileOpen(FileName, fmOpenRead);
      //повучаем длину файла в байтах
      iFileLength = FileSeek(iFileHandle,0,2);
      //передвигаем курсов в начало файла
      FileSeek(iFileHandle,0,0);
      //бувер для чтения файла делаем равным длине файла + 1байт
      pszBuffer = new int[iFileLength+1];
      //читаем в pszBuffer, повучаем количество прочитаных байт в iBytesRead
      iBytesRead = FileRead(iFileHandle, pszBuffer, iFileLength);
      //записываем в конец буфера 0
      pszBuffer[iFileLength]=0;
      //закрываем читаемый файл
      FileClose(iFileHandle);
 
      //Вот сдесь и начинается неправильная запись информации в переменные. Почему?
 
      //записываем чило массивов
      N=pszBuffer[4];
      //записываем максимальную длину масива
      L=pszBuffer[5];
      //Общее время записи
      t=pszBuffer[6];
      //Получаем массив коэфициентов
      for(int i=0;i<N;i++)
        k[i]=pszBuffer[7+i];
      //Массив графиков
      for(int i=0;i<N;i++)
        for(int j=0;j<1000;j++)
                Y[j][i]=pszBuffer[8+j+i*1000];
 
}
Есть метод обработки нажатия кнопки который генерирует массив массивов и передает его в функцию записи в файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall TForm1::Save1Click(TObject *Sender)
{
        //Создаем 8 массивов по 1000 элэметнов
        //заполняем их цифрама от 0 до 999
        int osc[1000][8];
        for(int i=0;i<8;i++)
        for(int j=0;j<1000;j++)
        osc[j][i]=j;
 
        //создаем массив коэфициентов
        int k[8];
        for(int i=0;i<8;i++)
        k[i]=1;
 
        //выбираем имя файла в окне "сохранить как"
        SaveDialog1->Execute();
        //Записываем данные
        rw->PutInFile(SaveDialog1->FileName,8,1000,1000,k,sizeof(k),osc,sizeof(osc));
}
Есть обработчик нажатия кнопки позволяющий извлечь инфомрацию из файла:
C++
1
2
3
4
5
6
7
void __fastcall TForm1::Open1Click(TObject *Sender)
{
//выбираем имя файла в окне "открыть"
OpenDialog1->Execute();
//извлекаем данные из файла
rw->GetFromFile(OpenDialog1->FileName);
}
Плюс есть конструктор:
C++
1
2
3
4
5
ReadWrite::ReadWrite()
{
        ver="ver";
        v=1;
}
В дальнейшем я буду получать инфомацию с осциллографа в виде нескольких массивов, каждый из которых будет представлять собой некий график.
Функция PutInFile нужна для записи данных графиков и информации о них в файл.
Поэтому для начала тестирую функцию записую массив массивов в файл.
Вродебы все записывается нормально.
А вот функция извлечения GetFromFile рабоатет некоректно.
N=pszBuffer[4];
в N записывается 0, а должно быть 8.
t=pszBuffer[7];
в t запивается 65234, а должно быть 1000;
Хотя в роде в pszBuffer информация считывается правильно, как мне кажется.

Но я не могу получить извлеченную информацию и поместить ее в переменную и массив.
Почуму?
Yandex
Объявления
21.10.2009, 17:50     Не могу записать переменую и массив в файл
Ответ Создать тему
Опции темы

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