Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 12

Запись и чтение из файла строковой переменной

22.04.2013, 14:29. Показов 3698. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Перехожу и Builder6 на XE. исправил кучу ошибок. в одном не могу развобраться.

вот пример:
одна кнопка пишет файл, другая читает.

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int err;
AnsiString FileName="C:\\tr.rom";
 
AnsiString music;
int iFile;
 
 iFile=FileCreate(FileName);
if (iFile==-1) {
                  ShowMessage("Неудалось открыть файл для Записи " + FileName);
                  return;
                }
 
   music="c:\\music.mp3";
 
    err=FileWrite(iFile,&music,music.Length());
       Label1->Caption=music;
       if (err==-1) {
                     ShowMessage("Music Не выводится");
                     FileClose(iFile);
                     return;
                    }
        FileClose(iFile);
 
}
 
 
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int iFile,err;
AnsiString FileName;
AnsiString music1;
 
   FileName="C:\\tr.rom";
 
      iFile = FileOpen (FileName,fmOpenRead);
      if (iFile==-1)
                {
                  ShowMessage("Неудалось открыть файл для чтения " + FileName);
                  return;
                }
 
    err=FileRead(iFile,&music1,music1.Length());
       if (err==-1) {
                     ShowMessage("Music Не Считывается");
                     FileClose(iFile);
                     return;
                    }
 
       Label2->Caption=music1;
 
     FileClose(iFile);
}
//---------------------------------------------------------------------------
в файл пишется из файла не считывается.

Пробовал так писать:

C++
1
err=FileWrite(iFile,music.c_str(),music.Length());
так записывается в текстовом виде, но читается все равно пустота
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.04.2013, 14:29
Ответы с готовыми решениями:

Запись/чтение переменной из файла
Добрый день. Стоит такая задача, нужно сделать чтобы переменная записывалась в блокнот. Потом чтобы эта переменная принимала значение в...

Чтение строковой переменной и числа из строки
Здравствуйте! Есть строка 4 Blabla 20000 Example 80000 Xdxdxd 30000 Kzlv 50000 4 это количество строк Нужно прочитать из...

Запись строковой переменной в файл
String z ; z= Edit5-&gt;Text.c_str(); FILE * ptrFile = fopen(&quot;1.txt&quot;, &quot;r&quot;); if (ptrFile != NULL) { ...

16
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
23.04.2013, 06:35
т.е. вы считываете в music1 количество байт равное длине music1?) как то масло маслено получается, не находите?)
не лучше ли для этого вычислить размер файла?)
а вообще FileRead не прочитает в AnsiString, используйте char*
0
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 12
23.04.2013, 10:58  [ТС]
>>не лучше ли для этого вычислить размер файла?)
в файле может же быть не одна переменная.

>>т.е. вы считываете в music1 количество байт равное длине music1?)
использовал и функцию sizeof(), но результат тот же.

>>а вообще FileRead не прочитает в AnsiString, используйте char*
в 6м билдере FileRead читал же AnsiString.
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
23.04.2013, 11:22
Цитата Сообщение от sachem Посмотреть сообщение
в файле может же быть не одна переменная.
кто бы еще об этом знал) кроме вас конечно)
Цитата Сообщение от sachem Посмотреть сообщение
использовал и функцию sizeof(), но результат тот же.
OMG) стало еще интересней) по-моему вы малость запутались) возможно путаете с записью/чтением структуры...
в FileRead третьим параметром передается кол-во байт, которые надо считать, а это известно лишь вам, т.к. только вы знаете сколько байт вы записали в файл) тут надо с самим собой договариваться)

вообще судя по всему вам проще использовать метод LoadFromFile класса TStringList
либо fopen/fputs/fgets
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
23.04.2013, 12:10
Цитата Сообщение от sachem Посмотреть сообщение
C++
1
2
3
AnsiString music1;
// ...
    err=FileRead(iFile,&music1,music1.Length());
А вот на этом моменте попытаемся думать логически. После объявления переменной она пуста, длина содержащейся в ней строки равна нулю - следовательно, метод Length() вернет ноль - следовательно, функция FileRead() прочитает ноль байт.
1
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 12
23.04.2013, 12:48  [ТС]
Действительно с этим я что-то ступил.
Хорошо, отойдем пока от размера
заменим
в запись:
C++
1
err=FileWrite(iFile,&music,12);
в чтении
C++
1
err=FileRead(iFile,&music1,12);
результат тотже. причем в пределах одного запуска программы чтение происходит, если перезапустить и считать не записывая, то опять пусто
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
23.04.2013, 13:35
обманываете вы однако, товарищ sachem, даже на запись не пройдет такой фокус с AnsiString и даже на bcb6
поверю еще, что можно корректно записать так
C++
1
err=FileWrite(iFile,music.c_str(),12);
но читать надо сначала в любом случае в char*

про AnsiString читаем тут
выдержка
AnsiString Represents a dynamically allocated string whose maximum length is limited only by available memory.
An AnsiString variable is a structure containing string information. When the variable is empty (when it contains a zero-length string), the pointer is nil and the string uses no additional storage. When the variable is nonempty, it points to a dynamically allocated block of memory that contains the string value.
Добавлено через 9 минут
поэтому если только сначала забить AnsiString, то получится:
C++
1
2
music1 = "00000";
err=FileRead(iFile,music1.c_str(),5);
0
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 12
24.04.2013, 09:48  [ТС]
что-то так и не получается.
записываю:
C++
1
2
3
 music="00000";
 
err=FileWrite(iFile,music.c_str(),5);
считываю:

C++
1
2
err=FileRead(iFile,music1.c_str(),5);
Label2->Caption=music1;
все равно считывается пусто. хотя в файле запись "00000" есть
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
24.04.2013, 09:56
sachem, вы уже в который раз не улавливаете сути, о чем я говорю.
я написал
C++
1
2
music1 = "00000";
err=FileRead(iFile,music1.c_str(),5);
первая строка здесь не случайна. и именно здесь, перед FileRead, а не перед FileWrite как у вас.
этой строкой мы выделяем память под 5 символов, куда будем считывать из файла.
но вообще это неправильный подход, если решили использовать AnsiString.

заметьте, если у вас в файле уже записано "00000", и вы выполните
C++
1
2
music1 = "1111111111";
err=FileRead(iFile,music1.c_str(),5);
то получите "0000011111"
0
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 12
24.04.2013, 10:03  [ТС]
понятно теперь.
Какой же тип применить вместо AnsiString?
потому как такой подход не устраивает. я же не знаю сколько мне нужно считать из файла.
нужна строка, но сколько в ней будет символов не известно
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
24.04.2013, 10:10
Цитата Сообщение от sachem Посмотреть сообщение
Какой же тип применить вместо AnsiString?
Цитата Сообщение от AntonChik Посмотреть сообщение
но читать надо сначала в любом случае в char*
Компренде?
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
24.04.2013, 10:16
Цитата Сообщение от sachem Посмотреть сообщение
Какой же тип применить вместо AnsiString?
Цитата Сообщение от AntonChik Посмотреть сообщение
используйте char*
Цитата Сообщение от sachem Посмотреть сообщение
я же не знаю сколько мне нужно считать из файла.
нужна строка, но сколько в ней будет символов не известно
именно поэтому
Цитата Сообщение от AntonChik Посмотреть сообщение
вам проще использовать метод LoadFromFile класса TStringList
пример 1
пример 2
0
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 12
24.04.2013, 15:58  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Компренде?
C этим понятно

вам проще использовать метод LoadFromFile класса TStringList
Дело в том, что у меня там сохраняются не только строковые переменные, а еще и данные типа int и массивы из них. можно конечно записать все в один текстовый файл, а потом разбирать его, но по моему это как-то не правильно. может лучше записывать в файл, перед сохранением строки, еще и количество байт в строке?
Или может перед считыванием строки заполнять ее, например 30ю символами, а потом разбирать где заканчиваются мои данные...
Или еще есть какой-то способ?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
24.04.2013, 17:19
Цитата Сообщение от sachem Посмотреть сообщение
может лучше записывать в файл, перед сохранением строки, еще и количество байт в строке?
Это стандартный способ записи бинарных файлов. И вполне себе хороший способ, надо сказать.
Еще зачастую используются заголовочные структурки для описания типа и размера данных, но тут надо помнить про выравнивание структур.

Добавлено через 2 минуты
А вообще, можешь использовать TIniFile - там и строковые, и числовые данные, и потоки, и массивы легко читать\записывать.
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
25.04.2013, 05:15
Цитата Сообщение от sachem Посмотреть сообщение
там сохраняются не только строковые переменные, а еще и данные типа int и массивы из них
это противоречит заголовку топика.

Цитата Сообщение от sachem Посмотреть сообщение
Или может перед считыванием строки заполнять ее, например 30ю символами, а потом разбирать где заканчиваются мои данные...
учитесь самостоятельно отбрасывать такие нерациональные решения.
0
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 12
26.04.2013, 12:08  [ТС]
а что если использовать ShortString? там, на сколько я понимаю, фиксированная длинна строки?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
26.04.2013, 13:48
Да, память там статическая - просто массив char внутри класса. Размер массива 256 байт, первый байт отвечает за длину строки, остальные под строку. Только вот смысла использовать ShortString я не вижу. Удобных методов для работы с текстом в этом классе нет, по сути там вообще почти ничего нет, это просто законспирированный char arr[255];.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.04.2013, 13:48
Помогаю со студенческими работами здесь

Запись строковой переменной в многомерный массив
Есть многомерный массив, его размеры задаются рандомно и есть слово заранее введенное с клавиатуры. Требуется записать слово в массив так,...

Вывести из файла необходимую информацию для пользователя заданного в строковой переменной
задача такая: в файле лежит список с именами пользователей и информацией предназначенных для них. необходимо вывести необходимую...

Чтение переменной из файла и занесение данных определенной переменной в combobox
Как сделать чтение из бинарного файла определенной переменной, а после занеся ее в combobox . (коллекции)

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -&gt; Vehicles -&gt; Firetruck_0 В этой папке лежит файл формата .dat Что нужно сделать? ...

Использовать значение строковой переменной как имя новой переменной
Есть некий объект (ob = ) и строка (st =&quot;name&quot;). Так вот нужно, чтобы name стало именем объекта ob. То есть &gt;&gt;&gt;name ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru