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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.84
morAlex
9 / 9 / 0
Регистрация: 06.01.2011
Сообщений: 73
#1

В файле заменить каждый символ первого наиболее короткого слова на «*» - C++

13.03.2011, 10:30. Просмотров 3961. Ответов 6
Метки нет (Все метки)

помогите пожайлуйста, только с доходчивым объяснением), Заранее огромное спасибо

В существующем на диске файле заменить каждый символ первого наиболее короткого слова на «*». (Считать, что слова разделены одним или несколькими пробелами или символами новой строки ‘\n’. Файл создать с помощью текстового редактора)
Вспомогательный файл не использовать.

ПОМОГИТЕ хотя бы самой идеей, пожайлуйста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2011, 10:30     В файле заменить каждый символ первого наиболее короткого слова на «*»
Посмотрите здесь:

C++ Найти в строке string наиболее часто встречающуюся пару символов и заменить на один новый символ
Ввести строку и два слова, заменить все вхождения первого слова на второе C++
C++ В строке символов заменить каждый второй символ s на f
C++ Наиболее часто встречающийся символ в текстовом файле
Найти слова где заданный символ встречаются наиболее часто C++
Строки: заменить каждый символ '/' на пару символов ':' C++
C++ Преобразовать строку, удалив каждый символ * и повторив каждый символ, отличный от *
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
qwartzq
1 / 1 / 0
Регистрация: 12.03.2011
Сообщений: 27
13.03.2011, 12:41     В файле заменить каждый символ первого наиболее короткого слова на «*» #2
первого наиболее короткого
как я понял в строке??

Читаем файл построчно. Ищем наиболее короткое слово: считаем символы между пробелами
пример: dshgf we h fgr woieur e

ищем первый и второй пробел, и измеряем длину, если 2 пробела подряд, то длина 1.
длина 2 - значит 1 символ (h)
3 - значит 2 символа (we) и так далее
проверяем на ситуацию, когда 1 символ последний. (e)

Во время поиска первого пробела у нас будет указатель на него. пусть это ptr_sp
Тогда если условие выполнится, нам надо str1[prt_sp+1]='*'

функция для поиска strchr(str1,' '), вернет указатель на 1 вхождение пробела
morAlex
9 / 9 / 0
Регистрация: 06.01.2011
Сообщений: 73
13.03.2011, 15:29  [ТС]     В файле заменить каждый символ первого наиболее короткого слова на «*» #3
а как узнать, что слово самое короткое и оно первое?
qwartzq
1 / 1 / 0
Регистрация: 12.03.2011
Сообщений: 27
13.03.2011, 16:02     В файле заменить каждый символ первого наиболее короткого слова на «*» #4
Можно при обработке файла завести переменную, которая будет хранить длину куска.
Если следующий кусок строго меньше текущего, то текущим становится следующий.

То есть ты проходишь строку, на выходе должен получить указатель на пробел перед самым коротким словом.
IrineK
Заблокирован
13.03.2011, 16:43     В файле заменить каждый символ первого наиболее короткого слова на «*» #5
Решение:
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
//чтение из файла
void fileDisplay(char* path)
{
    ifstream iFSTR;
    iFSTR.open(path);
    char buffer[80];
    if(iFSTR.is_open())
    {   while (iFSTR.good())
        {   iFSTR.getline(buffer,80,'\n');
                cout<<buffer<<"\n";
        }
        iFSTR.close();
    }
    else 
    {   cout<<"Error opening file\n";
        cin.get();
        exit(1);
    }
}
 
//поиск длины первого самого короткого слова
int shortest(char* path)
{   int N, min=100;
    string current, change="";
    ifstream iFSTR;
    iFSTR.open(path);
    if(iFSTR.is_open())
    {   while(iFSTR.good())
        {   iFSTR>>current; //считывание отдельных слов
            N = current.length();
            if (N < min) min = N;
        }
    iFSTR.close();
    return min;
    }
    else 
    {   cout<<"Error opening file\n";
        cin.get();
        exit(1);
    }
}
 
//замена слова на ** с записью в файл
void changeToStars(char* path, int minL)
{   long position;
    string current, change = "";
    for(int i = 0; i<minL;i++)
        change+="*"; //строка минимальной длины из **
    
    fstream FSTR;
    FSTR.open(path,fstream::in | fstream::out);
    if(FSTR.is_open())
    {   while(FSTR.good())
        {   FSTR>>current;//считывание отдельных слов
            if(current.length()==minL)
            {   position = FSTR.tellg();
                FSTR.seekp(position-minL);//возврат указателя на начало слова
                FSTR<<change;//замена на строку из **
                break;
            }
        }
    FSTR.close();
    }
    else
    {   cout<<"Error opening file\n";
        cin.get();
        exit(1);
    }
}
 
 
int main ()
{
    char* pathF = "test.txt";
    cout<<"Original file\n";
    cout<<"______________________________________________\n";
    fileDisplay(pathF);
    int found = shortest(pathF);
    changeToStars(pathF,found);
 
    cout<<"\n\nChanged file\n";
    cout<<"______________________________________________\n";
    fileDisplay(pathF);
 
    cin.get();  
    return 0;
}
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
13.03.2011, 18:08     В файле заменить каждый символ первого наиболее короткого слова на «*» #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
36
37
38
39
40
41
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <algorithm>
#include <iterator>
 
struct LenCmp {
    bool operator() (const std::string& a, const std::string& b){
        return a.size() < b.size();
    }
};
 
int main(){
    std::string buf;
    
    std::cout << "File name: ";
    std::cin >> buf;
    std::ifstream ifs(buf.c_str());
    if ( ! ifs.is_open() ){
        std::cerr << "Can't open file " << buf << " for input" << std::endl;
        return 1;
    }
    std::list<std::string> list;
    std::copy(std::istream_iterator<std::string>(ifs), std::istream_iterator<std::string>(), std::back_inserter(list));
    ifs.close();
    std::list<std::string>::iterator it = std::min_element(list.begin(), list.end(), LenCmp());
    int len = (*it).size();
    (*it).replace(0, len, len, '*');
    
    std::ofstream ofs(buf.c_str());
    if ( ! ofs.is_open() ){
        std::cerr << "Can't open file " << buf << " for output" << std::endl;
        return 1;
    }
    std::copy(list.begin(), list.end(), std::ostream_iterator<std::string>(ofs, " "));
    ofs.close();
    
    std::cerr << "Done." << std::endl;
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2011, 21:41     В файле заменить каждый символ первого наиболее короткого слова на «*»
Еще ссылки по теме:

C++ Заменить каждый символ ';' на ','
Каждый символ строки заменить на следующий за ним, а последний символ строки заменяеть первым C++
Подсчитать сколько раз встречается каждый символ в текстовом файле C++
Заменить каждый символ следующим по коду C++
C++ Заменить каждый второй элемент строки на заданный символ

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

Или воспользуйтесь поиском по форуму:
morAlex
9 / 9 / 0
Регистрация: 06.01.2011
Сообщений: 73
14.03.2011, 21:41  [ТС]     В файле заменить каждый символ первого наиболее короткого слова на «*» #7
Цитата Сообщение от qwartzq Посмотреть сообщение
Можно при обработке файла завести переменную, которая будет хранить длину куска.
Если следующий кусок строго меньше текущего, то текущим становится следующий.

То есть ты проходишь строку, на выходе должен получить указатель на пробел перед самым коротким словом.
Простите пожайлуйста, но ни могли бы вы показать мне эту часть цикла)
Благодарен
Yandex
Объявления
14.03.2011, 21:41     В файле заменить каждый символ первого наиболее короткого слова на «*»
Ответ Создать тему
Опции темы

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