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

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

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

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

19.10.2009, 13:45. Просмотров 1105. Ответов 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, записать значение переменной и массива в файл?
Плюс пытался записать структуру, выдает этуже ошибку. Молжно ли записать значение структуры или обекта в файл с помощью этой функции?
Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2009, 13:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу записать переменую и массив в файл (C++):

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

Не могу записать результат в файл - C++
в 37 строке ругается на ofstream пишет неизвестная функция #include "stdafx.h" #include <iostream> #include <cstdlib> #include...

Не могу записать числа в файл - C++
Не получается записать числа в файл (god,price). При открытии файла заместо чисел какие то символы. Как исправить? #include<iostream> ...

Заполнить динамический массив из файла и записать массив обратно в файл - C++
Подскажите пожалуйста функцию которая будет заполнять Динамический массив из файла и обратную которая этот массив запишет в файл=)

Нужно записать массив в файл, а потом из этого файла считать этот же массив - C++
Помогите, пожалуйста, никогда с файлами делов не имела. Нужно записать массив в файл, а потом из этого файла считать этот же массив. ...

Файл: Из текстового файла найти max и min элемент и записать в другой текстовой файл, не используя массив - C++
Из текстового файла найти max и min элемент и записать в другой текстовой файл, не используя массив

7
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
19.10.2009, 14:01 #2
Давай по-порядку. Что такое char N, и что такое int Y[] в параметрах ф-ции?
0
RazorQ
578 / 345 / 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);
И все таки объясни значение переменных в функции. Что куда должно записываться и что где должно находиться.
1
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);
}
Я просто хочу понять принцип записи в файл поэтому беру просто массив переменных и переменную произвольного типа, и передаю их в функцию которая должна записывать их в файл.
0
RazorQ
578 / 345 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
19.10.2009, 15:39 #5
Hacker_, а вот здесь у тебя Y - это указатель на первый элемент массива, поэтому записывается только этот первый элемент. Можно попробовать так, но это только в теории, сам не проверял
C++
1
FileWrite(iFileHandle, *Y, sizeof(*Y));
* - указывает на раскрытие указателя
0
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.
0
Alexandoros
228 / 66 / 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);
}
1
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 информация считывается правильно, как мне кажется.

Но я не могу получить извлеченную информацию и поместить ее в переменную и массив.
Почуму?
0
21.10.2009, 17:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2009, 17:50
Привет! Вот еще темы с ответами:

Не могу присовить структуре значения и записать в файл - C++
struct data { int id; char name; char grupp; } data1; int _tmain(int argc, _TCHAR* argv) { char x = &quot;sss&quot;;...

Массив записать в файл - C++
Добрый день! Не получается записать массив в файл. Файл создается но пустой. Я чувствую тут надо как то через указатель или ссылки. ...

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

Записать файл по блочно в массив - C++
Добрый день, нужна программа, которая записывает файл в массив. Размер каждого элемента массива равен 4 байта. Нужно чтобы все байты в...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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