Что я хочу сделать:
Храните записи в файле. Эти записи имеют две вещи.
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
Какие ограничения на строку? А как ты
признать, что пользователь ввел все данные, которые он хочет в
строка?
Если строка должна быть одной строкой, и мы можем предположить,
«разумная» длина (т. е. она легко уместится в память), затем
ты можешь использовать std::getline
чтобы получить строку в
std::string
(для ввода), а затем определить выходной формат,
сказать "%Y-%m-%d %H:%M:%S: user string\n"
за
файл. Если строка пользователя может состоять из нескольких строк, вы будете иметь
определить протокол для их ввода (чтобы вы могли знать, когда
одна запись закончена), и более сложный формат для
файл: одно предложение будет разделять записи по пустым
строка (что означает, что вход не может содержать пустую строку),
или использовать заголовок записи в соответствии с: "%Y-%m-%d
, (Subversion использует
%H:%M:%S line_count\n"
вариант этого для этого commit
Сообщения. Немного больше
информация, но отметка времени и количество строк
здесь.)
использование std::string
а также std::getline
как из <string>
заголовок
Если вы используете C ++, то std::string
лучший.
std::string abc="";
Я хочу хранить одну строку. Но я не знаю длину строки.
Тогда вам нужно использовать std::string
а не предварительно выделенный массив char
s.
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 сериализация библиотека.