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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.84
morAlex
9 / 9 / 0
Регистрация: 06.01.2011
Сообщений: 73
13.03.2011, 10:30     В файле заменить каждый символ первого наиболее короткого слова на «*» #1
помогите пожайлуйста, только с доходчивым объяснением), Заранее огромное спасибо

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

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

C++ Найти в строке string наиболее часто встречающуюся пару символов и заменить на один новый символ
Ввести строку и два слова, заменить все вхождения первого слова на второе C++
C++ [C++] в строке символов заменить каждый второй символ s на f
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
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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++ вводим текст с клавиатуры нужно заменить каждый символ

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

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

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

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