Ввод и сохранение строки, которая может быть любой длины по желанию пользователя

Что я хочу сделать:

Храните записи в файле. Эти записи имеют две вещи.

time_t rt; //which stores the time the record was entered by the user

и наряду с этим я хочу хранить одну строку. Но я не знаю длину строки.

Это будет зависеть от времени выполнения и будет зависеть от того, сколько символов вводит пользователь.

Что нужно сделать (по мне):

Я понятия не имею. Я знаю о динамическом распределении памяти, но не знал, как применить это к такой проблеме.

Что я пробовал:

Я попытался взять один символ за раз от пользователя и сохранить его в текстовом файле (временно).

ofstream fileObject;

fileObject.open("temp.txt");

for(int j=0;;j++)
{
ch = _getche();

if( ch == 13)  break; //user has pressed the return key

fileObject<<ch;
}

Затем я узнал размер файла, используя следующий код:

fileObject.seekp(0,ios::end);

long pos = fileObject.tellg(); //this is the size of the file

Затем я объявил динамический массив размером с файл.

char * entry;

entry = new char[pos]

Закрыл файл в режиме «out» и снова открыл его в режиме «in».

fileObject.close();

ifstream fout;

fout.open("temp.txt"); //this is the name of the text file that i had given

Затем по символу я скопировал содержимое текстового файла в массив символов:

for(int i=0;i<pos;i++)

fout>>info[i];

info[i] = '\0';

fout.close();

Но сейчас я не знаю, что делать дальше.

Что мне нужно, чтобы вы мне помогли:

Помогите мне записать эту запись как объект класса в двоичный файл «.dat».

Мои характеристики:

Windows XP SP 3

IDE: Visual C ++ 2010 Express

1

Решение

Какие ограничения на строку? А как ты
признать, что пользователь ввел все данные, которые он хочет в
строка?

Если строка должна быть одной строкой, и мы можем предположить,
«разумная» длина (т. е. она легко уместится в память), затем
ты можешь использовать std::getline чтобы получить строку в
std::string (для ввода), а затем определить выходной формат,
сказать "%Y-%m-%d %H:%M:%S: user string\n" за
файл. Если строка пользователя может состоять из нескольких строк, вы будете иметь
определить протокол для их ввода (чтобы вы могли знать, когда
одна запись закончена), и более сложный формат для
файл: одно предложение будет разделять записи по пустым
строка (что означает, что вход не может содержать пустую строку),
или использовать заголовок записи в соответствии с: "%Y-%m-%d
%H:%M:%S line_count\n"
, (Subversion использует
вариант этого для этого commit Сообщения. Немного больше
информация, но отметка времени и количество строк
здесь.)

1

Другие решения

использование std::string а также std::getlineкак из <string> заголовок

1

Если вы используете C ++, то std::string лучший.

std::string abc="";
1

Я хочу хранить одну строку. Но я не знаю длину строки.

Тогда вам нужно использовать std::string а не предварительно выделенный массив chars.

struct user_record
{
time_t rt; //which stores the time the record was entered by the user
std::string one_string;
};

Помогите мне записать эту запись как объект класса в двоичный файл «.dat».

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

std::ostream& operator <<(std::ostream& os, user_record const& ur)
{
return os << ur.rt << ' ' << ur.one_string;
}

std::istream& operator >>(std::istream& is, user_record& ur)
{
return is >> ur.rt >> ur.one_string;
}

Для чего-либо более сложного, чем однострочная строка, тогда, возможно, вам следует изучить Увеличение«s сериализация библиотека.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector