Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
Алена5
2 / 2 / 0
Регистрация: 17.05.2010
Сообщений: 68
#1

Считывание с файла чисел и букв, сортировка - C++

18.08.2010, 13:07. Просмотров 2141. Ответов 18
Метки нет (Все метки)

Помогите пожалуйста решить задачку.

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

Например:
Есть запись в файле:
"Марина - 5500грн.
Юра - 2600грн.
Саша - 5450грн."

Результат в консоли:
"5500грн. - Марина.
5450грн. - Саша.
2600грн. - Юра."
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.08.2010, 13:10     Считывание с файла чисел и букв, сортировка #2
Создайте структуру или класс, содержащую необходимые поля, то есть строку и число. Отсортируйте по числовому полю и выводите на экран.
Алена5
2 / 2 / 0
Регистрация: 17.05.2010
Сообщений: 68
18.08.2010, 13:21  [ТС]     Считывание с файла чисел и букв, сортировка #3
Именно ето у меня и не получаэться.
Использую такой код для чтения (просто другого не знаю)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FILE *file;
char* file_name = "D:\\1.txt";
char load_string[50]=" " ;
file = fopen( file_name, "r" );
if( file != 0 )
{
    while(!feof(file))
    {
fgets( load_string, 50 , file ); 
cout  << load_string;
    }
}
else
{
cout << "File not found" << endl;
}
fclose(file);
А он читает строку целиком. Может подскажите как считывать ето отдельно? Буду очень благодарна
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
18.08.2010, 13:41     Считывание с файла чисел и букв, сортировка #4
Алена5, А где структура? Ну по полю считывать. Число в числовое поле, строку в строковую.

Например.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct My
{
int a;
char str[255];
};
 
int main()
{
FILE*f;
//
My Ob[10];
for(int i=0;i<10;++i)
{
fscanf(f, "%d", &Ob[i].a);
fgets(Ob[i].str, 255, f);
}
Что-то вроде... Или while(!feof(f)) будет лучше...
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
18.08.2010, 13:53     Считывание с файла чисел и букв, сортировка #5
Вот решение на C++, если надо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <algorithm>
#include <list>
#include <string>
 
struct record
{
    std::string name;
    double money;
};
 
class compare
{
public:
 
    bool operator() (const record& rec1, const record& rec2) const
    {
        return (rec1.money < rec2.money);
    }
};
 
int main ()
{
    const std::string file ("input.txt");
    std::ifstream ifs (file.c_str ());
    if (!ifs)
    {
        std::cerr << "Error opening \'" << file << "\'for input" << std::endl;
        return EXIT_FAILURE;
    }
    std::list<record> db;
    record rec;
    while (ifs >> rec.name >> rec.money)
    {
        if (ifs.bad ())
        {
            std::cerr << "Error reading from \'" << file << "\'" << std::endl;
            return EXIT_FAILURE;
        }
        db.push_back (rec);
    }
    db.sort (compare ());
    for (std::list<record>::const_iterator it = db.begin ();
         it != db.end ();
         ++it)
        std::cout << it->money << "\t" << it->name << std::endl;
 
    return EXIT_SUCCESS;
}
Добавлено через 4 минуты
Только я вот что не понял. Ты сказала, цифры нужно сортировать по возрастанию, но в примере они у тебя отсортированы по убыванию. Так как все-таки сортировать?
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
18.08.2010, 14:02     Считывание с файла чисел и букв, сортировка #6
Как пример. Считывает, сортирует, выводит

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdlib.h>
 
struct t
{
   float a;
   char c[255];
};
 
int main()
{
   t Ob[3];
   FILE*f;
   f=fopen("Text.txt", "r");
   for(int i=0;i<3;++i)
   {
      fscanf(f, "%s", Ob[i].c);
      fscanf(f, "%f", &Ob[i].a);
   }
   for(int i=0;i<3;++i)
   {
      for(int j=0;j<3;++j)
      {
         if(Ob[i].a<Ob[j].a)
         {
            float temp=Ob[i].a;
            Ob[i].a=Ob[j].a;
            Ob[j].a=temp;
         }
      }
   }
   for(int i=0;i<3;++i)
      printf("%f %s\n", Ob[i].a, Ob[i].c);
   return 0;
}
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.08.2010, 14:06     Считывание с файла чисел и букв, сортировка #7
Если интересно, вариант на Си:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_NAME    32
#define MAX_STOCK   32
 
typedef struct stock_tag
{
    char name[MAX_NAME];
    int money;
} stock_t;
 
void swap(stock_t *a, stock_t *b)
{
    stock_t t = *a;
    *a = *b;
    *b = t;
}
 
int main()
{
    int i = 0;
    int j = 0;
    int nread = 0;
    FILE * pfile = NULL;
    stock_t stocks[MAX_STOCK];
 
    if((pfile = fopen("file.txt", "rb")) == NULL)
    {
        perror("can't open file\n");
        return EXIT_FAILURE;
    }
 
    while(!feof(pfile) && nread < MAX_STOCK)
    {
        fscanf(pfile, "%s - %d", stocks[nread].name, &stocks[nread].money);
        ++nread;
    }
 
    for(i = 0; i < nread; ++i)
        for(j = nread - 1; j > i; --j)
            if(stocks[j-1].money > stocks[j].money)
                swap(&stocks[j-1], &stocks[j]);
 
    for(i = 0; i < nread; ++i)
        printf("%s - %d\n", stocks[i].name, stocks[i].money);
    printf("\n");
 
    fclose(pfile);
    return EXIT_SUCCESS;
}
Добавлено через 58 секунд
Цитата Сообщение от Lavroff Посмотреть сообщение
float temp=Ob[i].a;
а чего это мы? деньги поменяли, а имена оставили? воровство какое-то..
ForEveR
18.08.2010, 14:07
  #8

Не по теме:

fasked, Ты знаешь в каком я ща состоянии. Я чтобы понять как это сделать хоть как-то чуть не убился.

Nameless One
18.08.2010, 14:07
  #9

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение
а чего это мы? деньги поменяли, а имена оставили? воровство какое-то..
Грабим богатых, и раздаем бедным

fasked
18.08.2010, 14:12
  #10

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
Грабим богатых, и раздаем бедным
это зависит от того, в какую сторону сортировать

ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
18.08.2010, 14:12     Считывание с файла чисел и букв, сортировка #11
fasked, все.. я тебя понял. дык сортировать то по деньгам надо)
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.08.2010, 14:14     Считывание с файла чисел и букв, сортировка #12
Цитата Сообщение от Lavroff Посмотреть сообщение
все.. я тебя понял. дык сортировать то по деньгам надо)
я подозреваю, что владелец у денег должен сохраниться после применения сортировки
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
18.08.2010, 14:14     Считывание с файла чисел и букв, сортировка #13
fasked, Зачем?

C
1
2
3
4
            t temp;
            temp=Ob[i];
            Ob[i]=Ob[j];
            Ob[j]=temp;
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
18.08.2010, 16:14     Считывание с файла чисел и букв, сортировка #14
Цитата Сообщение от Lavroff Посмотреть сообщение
C
1
2
3
4
...
fscanf(f, "%s", Ob[i].c); 
fscanf(f, "%f", &Ob[i].a);
...
Если имена в файле от чисел чёрточками отделены - у всех по нулям получится...
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
19.08.2010, 01:01     Считывание с файла чисел и букв, сортировка #15
Цитата Сообщение от easybudda Посмотреть сообщение
Если имена в файле от чисел чёрточками отделены - у всех по нулям получится...
Кстати, там немного забавнее получается. Файл создавать было лень, сделал вот, что:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
int main(void){
    const char *inStr = "Vasyl - 100500griv\nPetro - 13666griv\nMikola - 999999griv\n", *pInStr;
    char buf[BUFSIZ], *pBuf, ch, flag;
    
    char name[BUFSIZ] = { 0 };
    double money = 0.0;
    
    printf("\n%s\n", inStr);
    
    flag = 0;
    *buf = '\0';
    pBuf = buf;
    for ( pInStr = inStr; *pInStr; ++pInStr ){
        if ( isspace(*pInStr) ){
            *pBuf = '\0';
            pBuf = buf;
            if ( ! flag ){
                strcpy(name, buf);
                flag = 1;
            }
            else {
                money = atof(buf);
                printf("%.1f - %s\n", money, name);
                flag = 0;
            }
        }
        else
            *pBuf++ = *pInStr;
    }
    
    exit(EXIT_SUCCESS);
}
на выходе:
Считывание с файла чисел и букв, сортировка
P.S.
Lavroff, поймите правильно - это не с целью "поглумиться", просто интересно стало.
P.P.S.
А со scanf() скорее всего просто не работало бы - валилось бы при попытке прочесть число. Правда, результат работы scanf() нигде не проверяется... Вот, почему так здорово писать
C
1
2
3
4
 if ( scanf("%lf", &money) != 1 ) { 
    perror("scanf"); 
    exit(1);
}
Но можно и со scanf() попробовать, посмотреть, что будет... Комп взорваться от этого в принципе не должен...

Не по теме:

Особенно имя второго персонажа понравилось...

ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.08.2010, 01:05     Считывание с файла чисел и букв, сортировка #16
easybudda, Дело в том, что я писал пример, не учитывая черточки внутри файла между именем и денежным эквивалентом. Я не писал решение, только пример)
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
19.08.2010, 01:09     Считывание с файла чисел и букв, сортировка #17
А вот если чёрточки убрать и по одному пробелу оставить
C
1
2
    /* const char *inStr = "Vasyl - 100500griv\nPetro - 13666griv\nMikola - 999999griv\n", *pInStr; */
    const char *inStr = "Vasyl 100500griv\nPetro 13666griv\nMikola 999999griv\n", *pInStr;
то всё кошерно
Считывание с файла чисел и букв, сортировка

Не по теме:

Lavroff, да я же говорю - я не придираюсь. Сам в гораздо более простых вещах сотни раз ошибался. Просто из любопытства ковыряться стал.
Мало того - вот с первого раза не угадал я, что будет. А заниматься такими вещами по-моему полезно как раз, чтобы при отладке программы сразу представлять, где что искать. Обнуляться деньги и при неправильно сделанной сортировке могли...

ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.08.2010, 01:18     Считывание с файла чисел и букв, сортировка #18
easybudda, Кстати. А по токенам разбить вроде как тоже можно? То есть считывать в строку циклом до конца файла, разбивать на лексемы, писать имя в a.name[i], тире и пробел как токены, а потом каким-нибудь strtod или strtol разбивать оставшуюся часть? Или вообще не разбивать а так и оставлять, просто второе поле сделать тоже строковым, чтобы туда могло вместится NNNгрн. Хотя нет. Разбивать придется. Иначе сортировка не прокатит
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2010, 01:31     Считывание с файла чисел и букв, сортировка
Еще ссылки по теме:
C++ Считывание из файла чисел с плавающей точкой
Считывание чисел из файла и запись их в массив C++
Считывание чисел из файла с расширением .txt C++
Считывание из файла чисел, разделенных пробелом, в массив C++
Считывание чисел из файла и вычисление их среднего арифметического C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
19.08.2010, 01:31     Считывание с файла чисел и букв, сортировка #19
Lavroff, да можно как-то так сделать
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...
char buf[BUFSIZ], *p;
char name[BUFSIZ];
double money;
FILE * file;
...
while ( fgets(buf, BUFSIZ, file) ){
  if ( *buf == '\n' )
    continue; /* пустая строка */
  if ( ( p = strtok(buf, " -") ) == NULL ){
    fprintf(stderr, "Wrong file format!\n");
    exit(1);
  }
  strcpy(name, p);
  if ( ( p = strtok(NULL, "\n") ) == NULL ){
    fprintf(stderr, "Wrong file format!\n");
    exit(1);
  }
  money = atof(p);
  printf("%f - %s\n", money, name);
}
...
Yandex
Объявления
19.08.2010, 01:31     Считывание с файла чисел и букв, сортировка
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru