Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2015, 22:40   #1
Анастасия-18
 
Регистрация: 19.02.2015
Сообщений: 4
По умолчанию Считывание из файла

есть например файл такого содержания:
apples 10 23.4
bananas 5 25.0
bread 1 10.3


есть структура

struct food {
char name[20];
unsigned quantity;
float price;
};

я создала массив типа food: food Goods[3];

Как на C++ написать программу с использованием библиотеки fstream, которая считывает из файла данные и записывает их массив Goods, т.е. полю name каждый раз присваивается название продукта, полю quantity его количество и т.д.
Анастасия-18 вне форума Ответить с цитированием
Старый 20.02.2015, 00:53   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Для начала нужно просто открыть файл и вывести содержимое на экран. Далее, описать подробнее, что у вас не получается. Покажите до какого этапа вы добрались, то есть покажите вашу текущую программу
8Observer8 вне форума Ответить с цитированием
Старый 20.02.2015, 03:57   #3
Анастасия-18
 
Регистрация: 19.02.2015
Сообщений: 4
По умолчанию

Код:
#include<iostream>
#include<fstream>
#include <stdlib.h>

using namespace std;

//структура food

struct food {
char *name; 
unsigned quantity; 
float price; 
};



//инициализация
food initialization(){
	food sp;
	sp.name = new char[256];
	return sp;
}

//вывод на экран
void Write(food *Goods, int n)
{
for (int i=0;i<n;++i)
cout << i + 1 << ". " << "Name : " <<Goods[i].Name << "\n" <<"    quantity: " <<Goods[i].quantity<< "\n   " << "   Price: " <<Goods[i].Price <<endl;
}

//--------------------------------------------------------------------------------------------------------------------
int main(){
	const int n = 3;
	int size[n];
	
	food Goods[n];

	ifstream Infile("All.txt");

	if (!Infile) cout << "Not such file" << endl; else cout << "Opened" << endl;


	for (int i = 0; i < n; i++)
	{
		Goods[i] = initialization();
		size[i] = sizeof(int) + strlen(Goods[i].name) + sizeof(unsigned) + sizeof(int);


Это всё до чего дошла, дальше не хватает знаний, не могу придумать, как присвоить полям структуры значения, описанные в текстовом файле.

Последний раз редактировалось Stilet; 20.02.2015 в 07:33.
Анастасия-18 вне форума Ответить с цитированием
Старый 20.02.2015, 09:55   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Код:
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <cstring>

using namespace std;

struct food {
    char *name;
    unsigned quantity;
    float price;
};



//инициализация
food initialization(){
    food sp;
    sp.name = new char[256];
    return sp;
}

//вывод на экран
void Write(food *Goods, int n)
{
    for (int i=0;i<n;++i)
        cout << i + 1 << ". " << "Name : " << Goods[i].name << "\n" <<"    quantity: " <<Goods[i].quantity<< "\n   " << "   Price: " <<Goods[i].price <<endl;
}

int main()
{
    const int n = 3;
    int size[n];

    food Goods[n];

    ifstream Infile("C://goods.txt");

    if (!Infile) cout << "Not such file" << endl;
    else cout << "Opened" << endl;

    int i=0; // итератор
    while(Infile.peek() != EOF)
    {
        // инициализация структуры
        Goods[i] = initialization();

        char str[256]; // строка из файла
        Infile.getline(str, 256, '\n'); // считали строку

        char* item = strtok(str, " "); // ищем разделитель
        strcpy(Goods[i].name, item); // копируем в имя

        item = strtok (NULL, " "); // следующий разджелитель
        Goods[i].quantity = atof(item); // в количество

        item = strtok (NULL, " "); // следующий ... 
        Goods[i].price = atof(item); // в цену

        i++; // переходим на следующую структуру
    }
    Infile.close(); // закрываем файл
    return 0;
}
Вот так вот можно.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 20.02.2015, 11:36   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Анастасия-18

Важные замечания:

1) Это дело вкуса, но чаще всего принято имена классов и структур писать с большой буквы:

Код:
struct food
-->

Код:
struct Food
2) Очень аккуратно расставляйте отступы. Вот здесь комментарий выше:

Код:
//структура food

struct food {
А здесь ниже:

Код:
//инициализация
food initialization(){
3) Поставьте в настройках вашей среды, чтобы при нажатии на Tab вставлялось четыре пробела. Как видите форум не воспринимает табуляции, нужны пробелы. Да и пробелы - это общая практика

4) Комментарий пишите с большой буквы с отступом:

Код:
//структура food
-->

Код:
// Структура food
5) Скобки в функциях, классах и структурах лучше писать следующим образом:

Код:
food initialization()
{
    food sp;
    sp.name = new char[256];
    return sp;
}
6) В функции initialization() вы выделяете динамически память, а нигде её не освобождаете - это утечка памяти. Приучайте себя с самого начала на каждый new писать delete. Если я ничего не путаю, то после того, как объект вам не нужен, вам нужно вызвать сделать так:

Код:
Food myFood = initialization();

// Тут мы что-то делаем с myFood
// ...

// Здесь myFood нам не нужен. Мы удаляем область запрошенной ранее памяти для имени
delele myFood.name;
7) Исправьте, что я написал выше (если вам что-то привычно, то не исправляйте)

8) Посмотрите код WorldMaster и напишите какие строки в его коде непонятны. Постарайтесь использовать его код и свои новые мысли и покажите новую версию вашей программы. Будьте аккуратны

Последний раз редактировалось 8Observer8; 20.02.2015 в 11:41.
8Observer8 вне форума Ответить с цитированием
Старый 26.02.2015, 20:58   #6
Анастасия-18
 
Регистрация: 19.02.2015
Сообщений: 4
По умолчанию

спасибо большое!
учту все ваши замечания по поводу оформления
Анастасия-18 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считывание из файла СИ orandzheviyman Общие вопросы C/C++ 1 08.05.2014 11:20
Считывание из файла kuziashagrath85 Общие вопросы C/C++ 2 31.07.2012 08:16
считывание из файла vitalik560 C++ Builder 1 01.07.2011 12:53
считывание с файла G.I.JOE Общие вопросы C/C++ 2 06.06.2010 09:18
c++ считывание с файла. tsergey Помощь студентам 20 24.04.2010 23:30