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

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

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

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

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

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

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

ПОМОГИТЕ хотя бы самой идеей, пожайлуйста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2011, 10:30     В файле заменить каждый символ первого наиболее короткого слова на «*»
Посмотрите здесь:
C++ Наиболее часто встречающийся символ в текстовом файле
Каждый символ строки заменить на следующий за ним, а последний символ строки заменяеть первым C++
C++ Заменить каждый символ ';' на ','
Найти слова где заданный символ встречаются наиболее часто C++
Заменить каждый символ следующим по коду C++
Строки: заменить каждый символ '/' на пару символов ':' C++
C++ В строке символов заменить каждый второй символ s на f
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Эксперт CЭксперт С++
9465 / 5478 / 927
Регистрация: 25.07.2009
Сообщений: 10,502
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++ Найти в строке string наиболее часто встречающуюся пару символов и заменить на один новый символ
C++ Заменить каждый второй элемент строки на заданный символ
В строке каждый символ заменить на соответствующий ему код C++

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

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

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

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