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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
Dominion50
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
#1

Сортировка строк - C++

26.10.2011, 13:06. Просмотров 2627. Ответов 12
Метки нет (Все метки)

Помогите написать программу, которая читает строки из файла в массив строк, и выводит их на экран, отсортировав по названию, исключая правовую форму. Т.е. не сравнивает ЗАО , ОАО , ООО

Пример: ЗАО Оскол , ОАО Крона , ООО Аристократ

Должно получиться: ООО Аристократ , ОАО Крона , ЗАО Оскол

Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2011, 13:06     Сортировка строк
Посмотрите здесь:

сортировка строк C++
C++ сортировка строк
Сортировка строк C++
C++ Сортировка строк
C++ Сортировка строк
C++ Сортировка строк
Сортировка строк C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dominion50
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
02.11.2011, 09:43  [ТС]     Сортировка строк #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int _tmain(int argc, _TCHAR* argv[])
{
  setlocale( LC_ALL,"Russian" );
 
  char *str = new char [1024];
 
  //Открывает файл для чтения
 
  ifstream b_file;
 
  b_file.open("D:\\text1.txt");
 
  b_file>> str;
 
  printf("В файле находится строка %s \n", str );
 
  cin.get(); //Ожидание нажатия клавиши
 
  return 0;
В файле находится "Hello world !" ,но почему то в str записывается только "Hello"!

И ещё: как в файле перейти на вторую строку и сохранить всю строку в новой переменной?

Добавлено через 13 часов 25 минут
В общем что я насобирал:
1.Есть рабочая сортировка
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
52
53
54
55
56
57
58
void filter(const char* str, char** destlist);
void sort(char** strlist, int strcnt);
 
int main()
{
    char   str[80];
    char** strlist;
    int    delimcnt = 0;
 
    cin.getline(str, 80);
    
    for(int i = 0; str[i] != '\0'; i++)
        if(str[i] == ',' || str[i] == '.')
            delimcnt++;
 
    if(delimcnt == 0) {
        cout << "Wrong input string\n";
        return 1;
    }
 
    strlist = new char*[delimcnt];
    for(int i = 0; i < delimcnt; i++)
        strlist[i] = new char[20];
 
    filter(str, strlist);
    sort(strlist, delimcnt);
 
    for(int i = 0; i < delimcnt; i++)
        cout << strlist[i] << endl;
    getchar();
    getchar();
    return 0;
}
 
void filter(const char* str, char** destlist)
{
    for(int i = 0, j = 0, k = 0; str[i] != '\0'; i++) {
        if(str[i] == ',' || str[i] == '.') {
            // Если j не равно нулю, то прибавить единицу, дабы не скопировать запятую
            strncpy
                (destlist[k], str + j + (j != 0), i - j - (j != 0));
            destlist[k][i-j] = '\0';
            k++;
            j = i;
        }
    }
}
 
void sort(char** strlist, int strcnt)
{
    for(int i = 0; i < strcnt - 1; i++)
        for(int j = i + 1; j < strcnt; j++)
            if(strcmp(strlist[i], strlist[j]) > 0) {
                char* tmp = strlist[i];
                strlist[i] = strlist[j];
                strlist[j] = tmp;
            }
}
Но её надо немного доработать!

2)
Чтение из файла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void main( void ) 
{
FILE *file;
char* file_name = "text1.txt";
char load_string[50] = "none";
 
 
file = fopen_s( file_name, "r" );
if( file != 0 )
{
fgets( load_string, 50 , file ); 
}
printf("%s \n" , load_string);
getchar();
getchar();
Но в load_string записывается только первая строка файла!

Как мне объеденить в одно целое эти две программы?

Добавлено через 25 минут
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <clocale>
 
using namespace std;
 
 
void filter(const char* str, char** destlist);
void sort(char** strlist, int strcnt);
 
void main( void ) 
{
setlocale(LC_ALL,"Russian");
setlocale(LC_ALL,"rus");
FILE *file;
char* file_name = "text1.txt";
char str[100] = "none";
char** strlist;
int    delimcnt = 0;
 
 
file = fopen( file_name, "r" );
if( file != 0 )
{
fgets( str, 50 , file ); 
}
printf("%s \n" , str);
 
 
for(int i = 0; str[i] != '\0'; i++)
                if(str[i] == ',' || str[i] == '.')
                        delimcnt++;
 
        if(delimcnt == 0) {
                cout << "Wrong input string \n";
 
        }
 
        strlist = new char*[delimcnt];
        for(int i = 0; i < delimcnt; i++)
                strlist[i] = new char[20];
 
        filter(str, strlist);
        sort(strlist, delimcnt);
 
        for(int i = 0; i < delimcnt; i++)
                cout << strlist[i] << endl;
        getchar();
        getchar();
 
}
 
void filter(const char* str, char** destlist)
{
        for(int i = 0, j = 0, k = 0; str[i] != '\0'; i++) {
                if(str[i] == ',' || str[i] == '.') {
                        // Если j не равно нулю, то прибавить единицу, дабы не скопировать запятую
                        strncpy
                                (destlist[k], str + j + (j != 0), i - j - (j != 0));
                        destlist[k][i-j] = '\0';
                        k++;
                        j = i;
                }
        }
}
 
void sort(char** strlist, int strcnt)
{
        for(int i = 0; i < strcnt - 1; i++)
                for(int j = i + 1; j < strcnt; j++)
                        if(strcmp(strlist[i], strlist[j]) > 0) {
                                char* tmp = strlist[i];
                                strlist[i] = strlist[j];
                                strlist[j] = tmp;
                        }
}
Вот что получилось! Но есть пару недочётов:
1)в строку записываются с файла только первая строка
2) Не понял пока как пропустить первые 3-и буквы, на подобии "ЗАО",""OAO" и т.п.
3) При выводе отсортированных слов в конце их дописывается "Н"
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.11.2011, 11:10     Сортировка строк #3
Цитата Сообщение от Dominion50
Помогите написать программу, которая читает строки из файла в массив строк, и выводит их на экран, отсортировав по названию, исключая правовую форму. Т.е. не сравнивает ЗАО , ОАО , ООО
считывай их в вектор через string и getline()
сортируй их в векторе с помощью функции, которая принимает две строки
в функции разделяй каждую строку через stringstream и возвращай результат сравнения названий
(функция должна возвращать такие же значения, как strcmp() )
Dominion50
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
02.11.2011, 14:11  [ТС]     Сортировка строк #4
А можно поподробнее про stringstream? А то базы знаний почти никакой!
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
02.11.2011, 14:17     Сортировка строк #5
Dominion50, http://cplusplus.com/reference/iostream/stringstream/
Dominion50
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
02.11.2011, 16:58  [ТС]     Сортировка строк #6
А что сделать если выдаёт например
C++
1
невозможно преобразовать 'std::string' в 'char'
C++
1
невозможно преобразовать 'char [80]' 'char'
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.11.2011, 01:48     Сортировка строк #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
 
int main()
{
    string s = "ЗАО Оскол";
    string type, name;
    istringstream iss;
 
    iss.str(s);
    iss >> type >> name;
    cout << "type: \"" << type << "\", "
         << "name: \"" << name << "\""
         << endl;
 
    return 0;
}
Код
[guest@localhost tests]$ .iso++ t.cpp -o t
[guest@localhost tests]$ ./t
type: "ЗАО", name: "Оскол"
[guest@localhost tests]$
Dominion50
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
17.11.2011, 06:29  [ТС]     Сортировка строк #8
С сортировкой разобрался, а вот со строками не могу!

C++
1
2
3
4
5
while(!feof(fp))
  {
   fgets(str,1024, fp);
   printf("%s \n" , str);
  }
Вывод на экран содержание файла делаю этим методом!

Но вот есть вопрос! Как записать каждую строку в файле в отдельной переменной?
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.11.2011, 10:34     Сортировка строк #9
Цитата Сообщение от Dominion50
Вывод на экран содержание файла делаю этим методом!
C++
1
2
    while(fgets(str, sizeof str, fp) != NULL)
        printf("%s\n", str);
твой вариант не только выводит последнюю строку два раза, но и содержит ловушку для новичков, связанную с возможной ошибкой чтения в файле

Цитата Сообщение от Dominion50
Как записать каждую строку в файле в отдельной переменной?
делается массив указателей, потом для каждой строки выполняется malloc() + strcpy() и указатель сохраняется в массив
Dominion50
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
17.11.2011, 14:13  [ТС]     Сортировка строк #10
C++
1
2
3
4
5
6
7
8
9
10
char *str2;
  str2 = new char [100];
  int i =  0 ;
   while(fgets(str, sizeof str, fp) != NULL)
   {
    printf("%s\n", str); 
    str[i] = malloc(strlen(str)+1);
    strcpy(str[i],str);
    i++;
   }
Вот что получилось! Но что сделать с этими ошибками?
C++
1
2
error C2440: =: невозможно преобразовать 'void *' в 'char'  
error C2664: strcpy: невозможно преобразовать параметр 1 из 'char' в 'char *'
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.11.2011, 15:07     Сортировка строк #11
C++
1
    char str[100];
Dominion50
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 8
17.11.2011, 19:41  [ТС]     Сортировка строк #12
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
 FILE *fp = fopen("text1.txt","r");
 
 if(NULL == fp)
 {
 printf("Не удалось открыть файл! \n");
 return 0;
 }
 
  char str[100];
  char *str2;
  str2 = new char [100];
  int i =  0 ;
 
   while(fgets(str, sizeof str, fp) != NULL)
   {
    printf("%s\n", str); 
    str[i] = malloc(strlen(str)+1);
    strcpy(str[i],str);
    i++;
   }
  fclose(fp);
 
  system("pause");
  return 0;
}
не помогает

Добавлено через 1 час 51 минуту
может что-то заменить или добавить?

Добавлено через 1 час 38 минут
Уже по разному попробывал,что-то я понять не могу((
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2011, 23:09     Сортировка строк
Еще ссылки по теме:

Сортировка строк C++
C++ Сортировка строк
C++ Сортировка строк
Сортировка строк C++
C++ Сортировка строк

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

Или воспользуйтесь поиском по форуму:
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.11.2011, 23:09     Сортировка строк #13
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
    FILE *fp;
    char *lines[1000];
    char str[100];
    int i;
    
    fp = fopen("text1.txt", "r");
    if (fp == NULL) {
        fprintf(stderr, "Не удалось открыть файл!\n");
        return 1;
    }
 
    i = 0;
    while (fgets(str, sizeof str, fp) != NULL) {
        printf("%s\n", str); 
        if (i < 1000) {
            lines[i] = (char *) malloc(strlen(str) + 1);
            if (lines[i] != NULL)
                strcpy(lines[i], str);
            i++;
        }
    }
    fclose(fp);
 
    getchar();
    return 0;
}
Yandex
Объявления
18.11.2011, 23:09     Сортировка строк
Ответ Создать тему
Опции темы

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