Чтение из существующего текстового файла в С++

У меня есть файл (Existingfile.txt), содержащий сведения о продуктах питания, как показано ниже:

  1. Макароны 1,99
  2. Чизкейк 4.99

и так далее. Мне нужно написать программу на С++, которая читает эти записи. Могу ли я создать структуру следующим образом, чтобы читать записи как отдельные структуры?

struct food
{
int no;
string name;
float cost;
}s;

//TO read from file

void read(){
fstream f;
f.open("Existingfile.txt",ios::in);
while(!f.eof()){
f.read((char*)&s,sizeof(s));
.
.
.

}
.
.
.
f.close();

}

P.S. Я новичок в stackoverflow. Если мой вопрос неверен, пожалуйста, прокомментируйте, и я его проясню. Пожалуйста, ребята, мне нужна ваша помощь!


person ShankRam    schedule 22.11.2015    source источник
comment
Да, это возможно, но не непосредственно в вашей структуре. Вы можете прочитать его в байтовом разборе строки, что не особенно просто для этого формата. Возможно, fscanf сможет вам помочь. Вы гибки в формате файла или он задан?   -  person CompuChip    schedule 22.11.2015
comment
Простой ответ — нет, не в том смысле, в каком, я думаю, вы имеете в виду. Проблема в том, что ваша схема (такая, какая она есть) представляет собой: 1) индекс как целое число 2) период 3) ряд слов, разделенных пробелами, который заканчивается ценой 4) ценой. Но в вашей структуре не так много информации. Например, структура не может узнать, что первый символ цены 10,99 не является частью строки, предшествующей цене. Вам нужно будет написать простой код синтаксического анализа.   -  person Χpẘ    schedule 22.11.2015
comment
@CompuChip У меня есть гибкий формат файла. Это не дано.   -  person ShankRam    schedule 22.11.2015
comment
@ user2460798 Я могу изменить файл, чтобы удалить точку. Что касается названия продуктов питания, могу ли я добавить '\0' в конце, чтобы строка завершалась, когда встречает '\0'. Тогда это будет возможно?   -  person ShankRam    schedule 22.11.2015


Ответы (4)


Вы можете, но это довольно сложно, если вы используете такой текст, потому что он форматируется. Самый простой способ - использовать разделитель, чтобы его можно было разделить разделителем (например, пробелом). Например простой текст:

1;Pasta;300
2;Chess cake;400

вы можете разделить его на ; символа. Или, если вы используете пробел в качестве разделителя, вы можете просто использовать для этого входной поток.

instream >> num >> food >> total;

но ваш текст не должен содержать пробелов, кроме разделителя.

person Hernantas    schedule 22.11.2015

Вы пробовали его компилировать? если бы все элементы структуры были фиксированного размера c-style-strings, и если бы длина входной строки была фиксированной, это могло бы сработать.

Однако вы не можете так читать, потому что элементы в основном не являются символами. например, стоимость является числом с плавающей запятой. Если вы читаете «19,99». это будет просто строка "19,99", а не значение с плавающей запятой 19,99.

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

person Y.C.Jung    schedule 22.11.2015
comment
Код, который я упомянул в своем вопросе, является частью небольшой программы, которая работает следующим образом: я отображаю все элементы для пользователя. Пользователь вводит номер позиции. и он добавлен в его корзину. Я хочу использовать структуру, потому что будет легко сравнить номер элемента. пользователь входит в файл и находит стоимость и название предмета. Я буду использовать для этого следующий фрагмент кода: (в следующем комментарии) - person ShankRam; 22.11.2015
comment
@Compuchip (пожалуйста, прочтите мой предыдущий комментарий и проверьте это): codepad.org/mVN5RAT6 - person ShankRam; 22.11.2015

Я думаю, что есть более простой способ хранить ваши данные с помощью хеш-таблицы. Взгляните на эту ссылку, чтобы выяснить, как это реализовать. ссылка1

В качестве альтернативы вы также можете использовать массив для этого. link2

person Tung Le    schedule 22.11.2015
comment
Проблема с вашей идеей в том, что весь список элементов (он довольно большой) будет храниться в программе (наверное). Я не хочу, чтобы моя программа была очень большой по размеру. Вот почему я хочу, чтобы информация была только в файле, и я могу отображать ее, когда захочу. Пожалуйста, поправьте меня, если я ошибаюсь - person ShankRam; 22.11.2015
comment
Ты прав. Итак, вы можете создать структуру и поместить каждую строку файла в вектор размером 1xn, где каждая строка вектора будет хранить каждую строку файла. Вы можете увидеть ссылку здесь. - person Tung Le; 23.11.2015

person    schedule
comment
Хотя этот код может ответить на вопрос, было бы лучше включить некоторый контекст, объясняющий, как он работает и когда его использовать. Ответы, содержащие только код, в долгосрочной перспективе бесполезны. - person Bono; 22.11.2015