Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Работа с файлами


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

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

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

Автор: likehood 3.12.2007, 23:18
Код

#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";
    }
}

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

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

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

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

нет

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

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

на будущее: если можно использовать только BC 3.1, говорите об этом заранее

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

#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();
}      
      
      

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

Автор: Oleg_Ci 5.12.2007, 17:25
Через массив 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;
}

Автор: pioner_1983 5.12.2007, 20:40
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 цикле проблема начинается).

Автор: under_sun 5.12.2007, 22:19
Тут баг:
Код

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

И тут:
Код

mas_2[j]==i;

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

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

замени bool на int, true на 1, false на 0. и будет тебе щастье (если, конечно, других ошибок нет smile)

Автор: pioner_1983 6.12.2007, 16:58
Все откомпилил, спасибо большое за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)