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

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

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

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

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

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

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

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

Результат в консоли:
"5500грн. - Марина.
5450грн. - Саша.
2600грн. - Юра."
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2010, 13:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считывание с файла чисел и букв, сортировка (C++):

Считывание с текстового файла. Сортировка - C++
С текстового файла считать последовательность записей, содержащих данные о книге: <Автор>, <Название книги>, <Год издания>, <Количество...

Считывание строк из файла и сортировка , C++ - C++
Дело в том , что при считывании из файла последнюю строку считывает 2 раза. Прочитал в интернете мол надо строку очищать чтоб такого не...

Считывание данных из файла в массив и дальнейшая их сортировка - C++
Здравствуйте! В общем, задача такая: есть файл с двумя столбцами из чисел (числа с запятой). Нужно считать числа из второго столбца, затем...

Считывание отрицательных чисел из файла - C++
Собственно как считать из файла отрицательное число? Положительные числа считываются нормально, при считывание отрицательных программа...

Считывание целых чисел из файла - C++
Всем привет! Есть задача: считать из файла целые числа (в файле может быть все, что угодно) и сохранить их сумму в новый файл, вот код: ...

Считывание чисел из файла в массив - C++
Делая расчетку, запнулся на считывании данных :cry: Имеется файл вида n m 2 3 2 5 1 5 Например: 3 3

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fasked
Эксперт С++
4934 / 2514 / 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
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Эксперт С++
4934 / 2514 / 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
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
18.08.2010, 14:12 #11
fasked, все.. я тебя понял. дык сортировать то по деньгам надо)
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.08.2010, 14:14 #12
Цитата Сообщение от Lavroff Посмотреть сообщение
все.. я тебя понял. дык сортировать то по деньгам надо)
я подозреваю, что владелец у денег должен сохраниться после применения сортировки
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,607
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
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,607
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() попробовать, посмотреть, что будет... Комп взорваться от этого в принципе не должен...

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2010, 01:01
Привет! Вот еще темы с ответами:

Считывание слов и чисел из файла - C++
Доброго дня всем. Кто поможет найти ошибку? Я пытаюсь из файла считать слова и числа, они идут друг за другом. То есть слово пробел...

Считывание целых чисел из файла в вектор - C++
Встал вопрос о считывании целых чисел в вектор, но в файле всё char , как я понимаю. Какой самый производительный метод для...

Считывание из файла чисел с плавающей точкой - C++
программа считывания из файла чисел в двумерный массив но как только в файле обнаруживаются числа с плавающей точкой то программа перестает...

Считывание чисел из файла и запись их в массив - C++
Имеется файл txt со следующей строкой: ght# 1, nkat= 8, str= 1.00000, lmv= 0.5000 0.0001 0.0001 (reduced coord) ght# 2, nkat= ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.08.2010, 01:01
Ответ Создать тему
Опции темы

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