Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
12 / 12 / 5
Регистрация: 10.09.2009
Сообщений: 261

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

19.10.2009, 13:45. Показов 1749. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2009, 13:45
Ответы с готовыми решениями:

Классы (переменую res записать в richTextBox1)
Народ, скажите пожалуйста как переменую res записать в richTextBox1 using System; using System.Collections.Generic; using...

Я не могу добавить переменую string в строку
Всем привет, вообщем вот такая картина: unsigned long Size = 256; char* Bufer = new char; ...

Не могу записать в файл на windows, а на linux могу
Я не понимаю почему на windows не могу записать в файл данные...

7
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
19.10.2009, 14:01
Давай по-порядку. Что такое char N, и что такое int Y[] в параметрах ф-ции?
0
 Аватар для RazorQ
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
19.10.2009, 14:40
Цитата Сообщение от 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
12 / 12 / 5
Регистрация: 10.09.2009
Сообщений: 261
19.10.2009, 15:26  [ТС]
Бошьшое спасибо 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
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
19.10.2009, 15:39
Hacker_, а вот здесь у тебя Y - это указатель на первый элемент массива, поэтому записывается только этот первый элемент. Можно попробовать так, но это только в теории, сам не проверял
C++
1
FileWrite(iFileHandle, *Y, sizeof(*Y));
* - указывает на раскрытие указателя
0
12 / 12 / 5
Регистрация: 10.09.2009
Сообщений: 261
19.10.2009, 15:56  [ТС]
Цитата Сообщение от 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
229 / 67 / 11
Регистрация: 02.06.2009
Сообщений: 280
19.10.2009, 18:47
Цитата Сообщение от 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
12 / 12 / 5
Регистрация: 10.09.2009
Сообщений: 261
21.10.2009, 17:50  [ТС]
Большое спасибо 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.10.2009, 17:50
Помогаю со студенческими работами здесь

Не могу получить переменую c input типа fie метоом post
Привет подскажите пожалуйста в чем ошибка, пробую получить переменную c input типа file ничего не получается, вот код html: &lt;form...

Сгенерировать массив и записать в файл, отсортировать и записать в другой
у меня есть программа для сортирования массива &quot;пузырьком&quot;, но там она просто работает....мне нужно ее переделать, чтобы она сначала...

Записать элементы в массив и записать в файл
Здраствуйте, есть проблема нужно записать элементы счетчика t в одномерный массив и элементы которые посчитаны в цикле while s3. в другой...

Не могу записать файл
unauthorizedexception. Запускаю студию от имени администратора со всеми правами

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru