powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Написать программу, которая считывает текст из файла, находит самое длинное слово
9 сообщений из 9, страница 1 из 1
Написать программу, которая считывает текст из файла, находит самое длинное слово
    #39710680
Gomn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написать программу, которая считывает текст из файла, находит самое длинное слово и определяет, сколько раз оно встретилось в тексте. У меня прога работает, но только мне надо, чтоб текст считывал построчно, а у меня не считает, в чем проблема?
Код: plaintext
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.
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <fstream>
#include <cstring>
#include <string.h>
#include <ctype.h>
using namespace std;
int main()
{
 
    setlocale(LC_ALL, "rus");
    ifstream fin("text.txt");
    if (!fin)
    {
        cout << "Ошибка открытия файла";
        return 1;
    }
    fin.seekg(0,ios::end);
    const long len = 200;
    long len = fin.tellg();
    char *maxword = new char[len + 1];
    char *word = new char[len + 1];
    char *buf = new char[len + 1];
    fin.seekg(0, ios::beg);
    fin.read(buf,len);
    buf[len] = '\0';
    int i = 0, j = 0, k = 0, l = 0, wordlen = 0, maxwordlen = 0, wordcnt = 0;
    while(buf[i])
    {
        if (isalpha(buf[i]))
    {
        while(!(ispunct(buf[i])|| isspace(buf[i])|| (buf[i] == '\0')))
    {
        word[j++] = buf[i++];
    }
    word[j] = '\0';
    j = 0;
    wordlen = strlen(word); //возвращает длину строки
    cout << word/* <<'('<<wordlen<<')'*/;
        if(wordlen > maxwordlen)
    {
        maxwordlen = wordlen;
        strcpy(maxword, word); //копируем все символы строки
    }
    k = l = wordcnt = 0; 
    while(buf[k])
    {
        if (isalpha(buf[k]))
    {
        while(!(ispunct(buf[k])|| isspace(buf[k])|| (buf[k] == '\0')))
    {
        word[l++] = buf[k++];
    }
    word[l] = '\0';
    l = 0;
    if(strcmp(maxword,word) == 0) wordcnt++;
        }
        k++;
    }
}
    cout << buf[i];
    i++;
    }
    fin.close();
    cout << endl;
    cout << "Самое длинное слово: " << maxword << endl;
    cout << "Длина слова: " << maxwordlen << endl;
    cout << "Количество cлова: " << wordcnt << endl;
    system("pause");
    return 0;
}
...
Рейтинг: 0 / 0
Написать программу, которая считывает текст из файла, находит самое длинное слово
    #39710692
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GomnУ меня прога работает

Врёшь. Она даже компилироватся не будет. Двойное объявление len не позволит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написать программу, которая считывает текст из файла, находит самое длинное слово
    #39710693
Gomn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если убрать const long len = 200; то все работает, мой косяк
...
Рейтинг: 0 / 0
Написать программу, которая считывает текст из файла, находит самое длинное слово
    #39710787
Gomn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gomn,
Может, поможет whil getline?
...
Рейтинг: 0 / 0
Написать программу, которая считывает текст из файла, находит самое длинное слово
    #39711182
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gomn,

именно getline(). и размер файла тебе неважен - проверяй eof()

http://www.cplusplus.com/reference/ios/ios/eof/
...
Рейтинг: 0 / 0
Написать программу, которая считывает текст из файла, находит самое длинное слово
    #39712113
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GomnУ меня прога работает,Неужели эта кучка мутного кода работает правильно? Ну может быть, я не проверял.

Gomnно только мне надо, чтоб текст считывал построчно,Зачем построчно? Проще загрузить весь текст одним куском.

Gomn
Код: plaintext
1.
#include <Windows.h>

Зачем?

Gomn
Код: plaintext
1.
2.
3.
4.
    long len = fin.tellg();
    char *maxword = new char[len + 1];
    char *word = new char[len + 1];
    char *buf = new char[len + 1];

Можно обойтись всего одним буфером. Кстати, их по-хорошему надо delete-ать потом.

Gomn
Код: plaintext
1.
        strcpy(maxword, word); //копируем все символы строки

Можно обойтись без копирования элементов строки.

Я бы это сделал примерно так:
Код: plaintext
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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void count_longest_word(const char* file_path);

int main() {
  count_longest_word("text.txt");
  return 0;
}

const char* _longest_word;
int _longest_word_len;
int _longest_word_count;

bool is_letter(char elem);
void handle_word(const char* word, int word_len);

void count_longest_word(const char* file_path) {
  // грузим файл в память
  FILE* file = fopen(file_path, "rb");
  if (file == NULL) {
    printf("Cannot open file '%s'.\n", file_path);
    exit(1);
  }
  fseek(file, 0, SEEK_END);
  int text_len = ftell(file);
  fseek(file, 0, SEEK_SET);
  char* text = new char[text_len]; // вместо этого можно использовать std::vector или std::string
  fread(text, 1, text_len, file);
  fclose(file);

  _longest_word = NULL;
  _longest_word_len = 0;
  _longest_word_count = 0;

  // выделяем слова из текста
  int pos = 0;
  for (;;) {
    // пропускаем не-буквы
    while ((pos < text_len) && !is_letter(text[pos])) {
      pos++;
    }

    if (pos == text_len) {
      break;
    }

    // сканируем слово
    int word_start = pos;
    pos++; // пропускаем первую букву
    while ((pos < text_len) && is_letter(text[pos])) {
      pos++;
    }
    handle_word(text + word_start, pos - word_start);
  }

  if (_longest_word != NULL) {
    printf("Longest word is '%.*s' (%i letter(s)), encountered %i time(s).\n", _longest_word_len, _longest_word, _longest_word_len, _longest_word_count);
  } else {
    printf("No words.\n");
  }

  delete[] text;
}

bool is_letter(char elem) {
  // только английские буквы
  return (('a' <= elem) && (elem <= 'z')) || (('A' <= elem) && (elem <= 'Z'));
}

// word не завершается нулевым элементом ('\0')
void handle_word(const char* word, int word_len) {
  // для отладки
  printf("Encountered word '%.*s'.\n", word_len, word);

  if (word_len > _longest_word_len) {
    _longest_word = word;
    _longest_word_len = word_len;
    _longest_word_count = 1;
    return;
  }
  if ((word_len == _longest_word_len) && (memcmp(word, _longest_word, word_len) == 0)) {
    _longest_word_count++;
    return;
  }
}

Здесь всё сильно упрощено, но для учебного задания сойдёт. В реальной жизни текстовый файл запросто может быть в кодировке UTF-8, а в этой кодировке например каждая русская буква кодируется последовательностью из двух элементов (байтов). Например, буква «ж» кодируется последовательностью {208, 182}. И длина слова в буквах -- это уже получается нетривиальный вопрос.
...
Рейтинг: 0 / 0
Написать программу, которая считывает текст из файла, находит самое длинное слово
    #39712115
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня терзают смутные сомнения. Не вижу преобразования NFD=>NFC.
...
Рейтинг: 0 / 0
Написать программу, которая считывает текст из файла, находит самое длинное слово
    #39712123
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, да, если заморачиваться поддержкой всего Unicode-а (в том числе combining sequences), то будет гораздо сложнее. Но это же я так понимаю учебное задание, здесь не надо в такие дебри лезть.
...
Рейтинг: 0 / 0
Написать программу, которая считывает текст из файла, находит самое длинное слово
    #39728682
skibidi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше всего ставить себе Linux, там с Юникодом по проще будет.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Написать программу, которая считывает текст из файла, находит самое длинное слово
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]