0

Слова надо брать из текстового файла данных. Необходимо определить, сколько слов текста имеют длину 1, 2, 3, …10 и более 10 символов. Вывести эти слова в последовательности возрастания их длины. Слова очередной длины вывести с новой строчки и общее их количество. После проведения всех операций необходимо занести результат в файл протокола, в котором все данные выведены в таблицу, где в одном столбце выведена длина слов, а во втором - количество слов такой длины. Я пытался реализовать кое-что при помощи цикла for, но в консоль и протокол вместо нужных мне данных выводится зацикленный мусор такого типа: Длина слова:28 Количество слов:164

#include <iostream>
#include <fstream>
#include <iomanip> 
#include <string> 
#include <conio.h> 
#include <cstdlib> 
#include <windows.h>

using namespace std;

ifstream fin; ofstream fout;

void count(string FileName1, string FileName2) { SetConsoleCP(1251); SetConsoleOutputCP(1251);

string word;
int length = sizeof(word);
int count = 0;
fin.open(FileName1);
if (!fin)
{
    cout &lt;&lt; &quot;Ошибка открытия файла данных&quot; &lt;&lt; endl;
}
else
{
    cout &lt;&lt; &quot;Файл данных открыт успешно&quot; &lt;&lt; endl;
}


fout.open(FileName2);
if (!fout)
{
    cout &lt;&lt; &quot;Ошибка открытия файла результата&quot; &lt;&lt; endl;
}
else
{
    cout &lt;&lt; &quot;Файл результата открыт успешно&quot; &lt;&lt; endl;
}


while (!fin.eof())
{
    fin&gt;&gt;word;
    for (int i = 0; i &lt; 30; i++)
    {

        if (length == i)
        {
            count++;
        }
        cout &lt;&lt; &quot;Длина слова:&quot; &lt;&lt; length &lt;&lt; &quot; Количество слов:&quot; &lt;&lt; count &lt;&lt; endl;
        fout &lt;&lt; &quot;Длина слова:&quot; &lt;&lt; length &lt;&lt; &quot; Количество слов:&quot; &lt;&lt; count &lt;&lt; endl;
    }

}

}

const char* table[256] = { "_______________________________________________", "| Строки |", "|=============================================|", "| Длина слова | Количество слов |", "+=============================================+", };

int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); //dash("Result.res", "Myfile.txt"); count("Myfile.txt", "Result.res"); system("pause"); }

1 Answers1

1

Проще переписать логику, чем понять вашу :) - типа, находить длину слова, а потом уже его читать... Или искать его как int length = sizeof(word);. Все так запущено, что вот вам это:

int count[12]  = {0};

while (fin>>word) { int len = word.size(); if (len > 10) len = 11; count[len]++; }

Все. По окончании работы в count[1] - число слов длиной 1, в ... , в count[10] - число слов длиной 10, в count[11] - число слов длиной > 10.

И еще - дайте тому, кто учил вас писать while (!fin.eof())... ну, в общем, что-то нехорошее... См. Правильное использование проверки конца файла

Harry
  • 221,325
  • Мог бы сказать что-то нехорошее, если бы этот человек не был моим преподавателем, с которым очень опасно спорить – Никита Злобин Jul 12 '21 at 06:57
  • Всё выводится почти правильно, но вместо количества слов выводится 006FFA70. Также хотелось бы, чтобы все результаты выводились по возрастанию количества символов – Никита Злобин Jul 12 '21 at 07:37
  • Выводите правильно, только и всего. Вангую, что вы выводите count (cout << count), хотя я четко написал, что нужные значения - в элементах массива. Ну, а если выводить правильно, в цикле, поочередно - то вывод по возрастанию будет получен автоматически... – Harry Jul 12 '21 at 07:45