Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Работа с файлами 
:(
    Опции темы
pioner_1983
Дата 3.12.2007, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Дан текстовый файл содержащий следующую информацию: Наименование товара и количество имеющегося товара. Например:
Код

osu 5
hdd 4
mb 2
osu 7
mb 6
hdd 4

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


Это сообщение отредактировал(а) pioner_1983 - 3.12.2007, 21:50
PM MAIL   Вверх
likehood
Дата 3.12.2007, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 12
Всего: 24



Код

#include <map>
#include <string>
#include <fstream>
#include <iostream>

int main()
{
    std::map<std::string, int> articles;
    std::ifstream file("article.txt");
    if (!file) {
        std::cerr << "Can't open file\n";
        return 1;
    }

    while (1)
    {
        std::string name;
        int count;
        file >> name >> count;
        if (file.eof())
            break;
        articles[name] += count;
    }

    for (std::map<std::string, int>::const_iterator it=articles.begin();
        it!=articles.end(); ++it)
    {
        std::cout << it->first << " => " << it->second << "\n";
    }
}

PM MAIL   Вверх
under_sun
Дата 3.12.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 3.10.2007
Где: Ебург

Репутация: 7
Всего: 17



map<string, int> тебе в помощь! smile 
А если не знаком с STL, то самое простое - это завести 2 массива: в одном храни наименование товара, а во втором соответствующее значение.
При чтении каждой новой строки в цикле, проверяешь, есть ли такой товар в первом массиве. Если есть, то увеличиваешь соответствующее значение во втором массиве.

Опоздал с map -ом smile 

Это сообщение отредактировал(а) under_sun - 3.12.2007, 23:25
--------------------
TMTOWTDI
PM MAIL ICQ   Вверх
pioner_1983
Дата 4.12.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Спасибо за помощь!
Но есть одна проблема.
Проблема в том что у нас в универе все проги проверяются на компиляторе Borland C++ v3.1, а он как я понял STL не поддерживает.
Можно ли както откомпилить эту прогу в Borland C++ v3.1? Может нужно добавить оответствующую библиотеку, (Пробовал библиотеку из DevCpp, всеравно не компилится) или текст проги изменить?
Или отсается только через массивы делать?

Это сообщение отредактировал(а) pioner_1983 - 5.12.2007, 00:00
PM MAIL   Вверх
likehood
Дата 5.12.2007, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 12
Всего: 24



Цитата(pioner_1983 @  4.12.2007,  23:59 Найти цитируемый пост)
Можно ли както откомпилить эту прогу в Borland C++ v3.1?

нет

Цитата(pioner_1983 @  4.12.2007,  23:59 Найти цитируемый пост)
Или отсается только через массивы делать?

да, это самый простой способ.

на будущее: если можно использовать только BC 3.1, говорите об этом заранее
PM MAIL   Вверх
pioner_1983
Дата 5.12.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



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

#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "stdlib.h"
#define FNAME "c:\\bd.txt\0"
main()
{
      char fname [90]=FNAME;
      FILE *out;
      char naim [30];
      char kol [30];
      char mas_1[30];
      int mas_2[43];
      int i,j;
      i=0;
      j=0;
      
  if ((out=fopen(fname, "rt"))==NULL)
{
  printf("error read file %s",fname);
 getch();
 return 0;
}

while (!feof(out))
 {
       fscanf (out,"%s %s",naim, kol);
          if (feof(out))  break;
            if(strcmp(naim, mas_1))
             mas_1==naim;
            
            
 }
 

while (!feof(out))

 {
      fscanf (out,"%s %s",naim, kol);
       if (feof(out))  break;
        if(!strcmp(mas_1, naim))
          i=atoi(kol);
        mas_2[j]==i;
      printf ("%s %i",mas_1, mas_2);
 }

getch();
}      
      
      

Проблема в том что ответ не выводится. Подскажите где ошибки плз..
      
                 


Это сообщение отредактировал(а) pioner_1983 - 5.12.2007, 20:42
PM MAIL   Вверх
Oleg_Ci
Дата 5.12.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Через массив smile 
Код

#include <stdio.h>
#include <string.h>

const int len = 10; // количество сиволов в названии товара

struct CBook{
    char name[len]; // название товара
    int count; // количество
    CBook(){ // конструктор
        count = 0;
        name[0] = '\0';
    }
    bool Compare( const CBook & book ){ // сравнение товаров
        if(strcmp( book.name, name )) return false; // если не равны
        count += book.count; // если равны то увеличиваем количество
        return true;
    }
};

int main(){
    const int size = 50; // количество товаров
    int count=0, j; // количесто считанных товаров
    CBook book[size], tmp; // массив товаров

    FILE *file = fopen( "text.txt", "r" );
    if( !file ) return 1;

    while(1)
        if(fscanf( file, "%s%d", tmp.name, &tmp.count ) <= 0 )
            break;
        else{
            for( j=0; j<count; ++j )
                if( book[j].Compare( tmp )) break;
            if( j == count )
                book[count++] = tmp;
        }

    for( j=0; j<count; ++j )
        printf("%12s %d\n", book[j].name, book[j].count );
    getchar(); // пауза
    return 0;
}

PM MAIL   Вверх
pioner_1983
Дата 5.12.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Oleg_Ci, Спасибо за помощь, но к сожелению твоя прога не компилится в BC++ 3.1. Компилятор 2 раза ругается на bool Compare в 13 строке, пишет Type name expected и Declaration missing ;. И еще ругается на 33 строку, пишет 'Compare' is not a member of 'CBook'
Скажите плз... можно ли откомпилить эту прогу в BC++ 3.1, если да то как ипсравить ошибки. 
Или помогите исправить ту прогу, которую я  скинул в 6 посте. Она почему то ответ не выдает (Там навреное в 1 цикле проблема начинается).


Это сообщение отредактировал(а) pioner_1983 - 5.12.2007, 20:41
PM MAIL   Вверх
under_sun
Дата 5.12.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 3.10.2007
Где: Ебург

Репутация: 7
Всего: 17



Тут баг:
Код

if(strcmp(naim, mas_1))
     mas_1==naim;

И тут:
Код

mas_2[j]==i;

И где у тебя массив товаров? И логику твою с двумя while -ми я как-то не очень понял...

--------------------
TMTOWTDI
PM MAIL ICQ   Вверх
likehood
Дата 5.12.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 12
Всего: 24



Цитата(pioner_1983 @  5.12.2007,  20:40 Найти цитируемый пост)
 Компилятор 2 раза ругается на bool Compare в 13 строке

замени bool на int, true на 1, false на 0. и будет тебе щастье (если, конечно, других ошибок нет smile)
PM MAIL   Вверх
pioner_1983
Дата 6.12.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Все откомпилил, спасибо большое за помощь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.