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

Сформировать массив слов из файла - C++

Восстановить пароль Регистрация
 
Kastel
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 5
10.12.2013, 01:12     Сформировать массив слов из файла #1
Здравствуйте. Подскажите пожалуйста, как сделать задание?
В файле находится текст неизвестной длины, содержащий слова, знаки препинания и пробелы. Надо сформировать массив слов из этого текста и отсортировать его по алфавиту. Затем записать результат в другой файл.
Как понимаю, тут надо использовать динамическую память с ее изменением, типо realloc, так как длина неизвестна.
Вот как сформировать такой массив, отбросив знаки препинания все?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2013, 01:12     Сформировать массив слов из файла
Посмотрите здесь:

C++ Написать программу, которая читает строки из файла в массив строк, и выводит их на экран только названия, состоящие из нескольких слов
C++ Сформировать новый файл, дописав в каждую строку исходного файла количество, содержащихся в ней слов.
C++ Функция, получает строку слов и рзделителей, а на выходе имеет массив слов из строки и количество этих слов
C++ Дан текст, состоящий не менее чем из пяти слов. Сформировать стек из тех слов, в которых присутствует буква "Е"
C++ Дан текст, состоящий не менее чем из пяти слов. Сформировать стек из тех слов, в которых присутствует буква "Е"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
riki34
2 / 2 / 0
Регистрация: 10.11.2013
Сообщений: 24
10.12.2013, 07:10     Сформировать массив слов из файла #2
Есть функция такая, ifstream::readline(строка, к-во символов, стоп-символ);
Читает до стоп символа, то есть стоп символ можно поставить пробел, и знаки препинания и циклом считывать, пока !ifstream::eof();
А длину можно посчитать пройдясь перед этим по файлу с функцией ifstream::readline инкрементируя счетчик а читать в какую то левую строчку.
Kastel
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 5
10.12.2013, 16:18  [ТС]     Сформировать массив слов из файла #3
Цитата Сообщение от riki34 Посмотреть сообщение
Есть функция такая, ifstream::readline(строка, к-во символов, стоп-символ);
Читает до стоп символа, то есть стоп символ можно поставить пробел, и знаки препинания и циклом считывать, пока !ifstream::eof();
А длину можно посчитать пройдясь перед этим по файлу с функцией ifstream::readline инкрементируя счетчик а читать в какую то левую строчку.
А массив слов как записать? Как массив указателей? Или как ступенчатый?
riki34
2 / 2 / 0
Регистрация: 10.11.2013
Сообщений: 24
10.12.2013, 18:05     Сформировать массив слов из файла #4
Цитата Сообщение от Kastel Посмотреть сообщение
А массив слов как записать? Как массив указателей? Или как ступенчатый?
Ну как массив указателей, типо
C++
1
char** a = new char*[n];
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 18:38     Сформировать массив слов из файла #5
Цитата Сообщение от riki34 Посмотреть сообщение
ifstream::readline(строка, к-во символов, стоп-символ)
Это откуда, в ifstream, такая readline взялась?
Kastel
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 5
11.12.2013, 02:28  [ТС]     Сформировать массив слов из файла #6
Здравствуйте. Подскажите пожалуйста, как сделать задание?
В файле находится текст неизвестной длины, содержащий слова, знаки препинания и пробелы. Надо сформировать массив слов из этого текста и отсортировать его по алфавиту. Затем записать результат в другой файл.
Как понимаю, тут надо использовать динамическую память с ее изменением, типо realloc, так как длина неизвестна.
Вот, что у меня пока получается. Обнаружил, что strtok не работает с указателем на символьный массив. Что можно тогда сделать? Что я не так делаю? Помогите, пожалуйста.
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
#include<stdio.h>
#include<string>
void main()
{
FILE *fp1;
if((fp1=fopen("f1.txt","r"))!=NULL)
{
    char *c;
    char *word,*words={0};
int n,i;
 while((*c = fgetc(fp1)) != -1)
 {fgetc(fp1);
  if(n==0) break;
  n++;
  c=(char*)realloc(c,sizeof(char)+1);
  c[n-1]=fgetc(fp1);
 }
for(n=strlen(c)-1;i>=0;i--)
{
if(c[i]=='\n') c[i]=' ';
else break;
}
for(n=strlen(c)-1;i>=0;i--)
{
if(c[i]=='!' || c[i]=='?' || c[i]=='.' || c[i]==',' || c[i]==':' || c[i]==';' || c[i]=='"' || c[i]=='<' || c[i]=='>' || c[i]=='(' || c[i]==')') c[i]=0;
else break;
}
i=0;
 
word=strtok(с," ");
while(word)
{
words[i]=word;
printf("Word = %s\n",word);
word=strtok(0," ");
i++;
}
free(c);
fclose(fp1);
}
else printf("ERROR WHILE OPENING FILE\n");
}
Добавлено через 12 минут
Цитата Сообщение от Kastel Посмотреть сообщение
C++
1
2
fgetc(fp1);
* if(n==0) break;
Это лишнее, забыл удалить

Добавлено через 6 минут
Цитата Сообщение от Kastel Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
for(n=strlen(c)-1;i>=0;i--)
{
if(c[i]=='\n') c[i]=' ';
else break;
}
for(n=strlen(c)-1;i>=0;i--)
{
if(c[i]=='!' || c[i]=='?' || c[i]=='.' || c[i]==',' || c[i]==':' || c[i]==';' || c[i]=='"' || c[i]=='<' || c[i]=='>' || c[i]=='(' || c[i]==')') c[i]=0;
else break;
}
и тут правильно будет
C++
1
2
3
4
5
6
7
8
9
10
for(i=n-1;i>=0;i--)
{
if(c[i]=='\n') c[i]=' ';
else break;
}
for(i=n-1;i>=0;i--)
{
if(c[i]=='!' || c[i]=='?' || c[i]=='.' || c[i]==',' || c[i]==':' || c[i]==';' || c[i]=='"' || c[i]=='<' || c[i]=='>' || c[i]=='(' || c[i]==')') c[i]=0;
else break;
}
Ev[G]eN
Эксперт С++
 Аватар для Ev[G]eN
5093 / 1531 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
11.12.2013, 11:26     Сформировать массив слов из файла #7
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 <algorithm>
#include <iterator>
#include <iostream>
#include <fstream>
#include <clocale>
#include <string>
#include <vector>
 
int main()
{
    std::setlocale(0, "");
    const std::string delimeters("!?;:., ");
 
    std::fstream inputFile("input file.txt");
    std::string currentFileString;
    std::vector <std::string> wordsFromFile;
    while (std::getline(inputFile, currentFileString)) {
        char *buffer = nullptr;
        char *currentWordInString(strtok_s(const_cast <char *> (currentFileString.c_str()), delimeters.c_str(), &buffer));
        while (currentWordInString) {
            wordsFromFile.push_back(currentWordInString);
            currentWordInString = strtok_s(nullptr, delimeters.c_str(), &buffer);
        }
    }
    inputFile.close();
 
    std::cout << "Слова из файла: " << std::endl;
    std::copy(wordsFromFile.begin(), wordsFromFile.end(), std::ostream_iterator <std::string> (std::cout, " "));
    std::cout << std::endl << std::endl << "Отсортированные слова: " << std::endl;
    std::sort(wordsFromFile.begin(), wordsFromFile.end());
    std::copy(wordsFromFile.begin(), wordsFromFile.end(), std::ostream_iterator <std::string>(std::cout, " "));
 
    std::fstream resultFile("result file.txt", std::ios::out);
    for (auto currentWord : wordsFromFile)
        resultFile << currentWord << " ";
    resultFile.close();
    std::cout << std::endl << std::endl << "Результат записан в файл!" << std::endl;
 
    std::system("pause");
    return 0;
}
riki34
2 / 2 / 0
Регистрация: 10.11.2013
Сообщений: 24
11.12.2013, 17:25     Сформировать массив слов из файла #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Это откуда, в ifstream, такая readline взялась?
В Visual Studio спокойно работает

Добавлено через 5 минут
Цитата Сообщение от riki34 Посмотреть сообщение
В Visual Studio спокойно работает
А точнее в объектах созданных от ifstream
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 18:05     Сформировать массив слов из файла #9
Цитата Сообщение от riki34 Посмотреть сообщение
В Visual Studio спокойно работает
Какая судия? И, если можно, код. Потому, что смотрю я ifstream, и readline там не вижу. http://www.cplusplus.com/reference/fstream/ifstream/
Kastel
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 5
11.12.2013, 19:25  [ТС]     Сформировать массив слов из файла #10
Цитата Сообщение от Ev[G]eN Посмотреть сообщение
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 <algorithm>
#include <iterator>
#include <iostream>
#include <fstream>
#include <clocale>
#include <string>
#include <vector>
 
int main()
{
    std::setlocale(0, "");
    const std::string delimeters("!?;:., ");
 
    std::fstream inputFile("input file.txt");
    std::string currentFileString;
    std::vector <std::string> wordsFromFile;
    while (std::getline(inputFile, currentFileString)) {
        char *buffer = nullptr;
        char *currentWordInString(strtok_s(const_cast <char *> (currentFileString.c_str()), delimeters.c_str(), &buffer));
        while (currentWordInString) {
            wordsFromFile.push_back(currentWordInString);
            currentWordInString = strtok_s(nullptr, delimeters.c_str(), &buffer);
        }
    }
    inputFile.close();
 
    std::cout << "Слова из файла: " << std::endl;
    std::copy(wordsFromFile.begin(), wordsFromFile.end(), std::ostream_iterator <std::string> (std::cout, " "));
    std::cout << std::endl << std::endl << "Отсортированные слова: " << std::endl;
    std::sort(wordsFromFile.begin(), wordsFromFile.end());
    std::copy(wordsFromFile.begin(), wordsFromFile.end(), std::ostream_iterator <std::string>(std::cout, " "));
 
    std::fstream resultFile("result file.txt", std::ios::out);
    for (auto currentWord : wordsFromFile)
        resultFile << currentWord << " ";
    resultFile.close();
    std::cout << std::endl << std::endl << "Результат записан в файл!" << std::endl;
 
    std::system("pause");
    return 0;
}
Спасибо большое, но мне надо это задание сделать на языке Си без использования векторов и так далее. Я изучаю язык только первый семестр. Мне вот надо как-то с помощью массива указателей и динамической памяти, выделяемой по мере по записи в массив, так как файл неизвестной длины.

Добавлено через 5 часов 48 минут
Как можно сделать на языке Си?

Добавлено через 11 минут
Помогите, пожалуйста

Добавлено через 37 минут
Надо завтра сдать

Добавлено через 52 минуты
Может кто помочь?

Добавлено через 20 минут
Никто не знает?
riki34
2 / 2 / 0
Регистрация: 10.11.2013
Сообщений: 24
11.12.2013, 20:44     Сформировать массив слов из файла #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Какая судия? И, если можно, код. Потому, что смотрю я ifstream, и readline там не вижу. http://www.cplusplus.com/reference/fstream/ifstream/
Щас не могу позже когда дома буду.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2013, 16:43     Сформировать массив слов из файла
Еще ссылки по теме:

C++ Создать список слов из файла и подсчитать количество повторения этих слов
Задача сформировать массив строк и реализовать функции определения количества слов C++
C++ Считать из файла целочисленный массив C[N] и сформировать из него максимально возможную матрицу А [n x n]

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

Или воспользуйтесь поиском по форуму:
Памирыч
12.12.2013, 16:43     Сформировать массив слов из файла
  #12
 Комментарий модератора 
Закрыто. Причина: кросспостинг
Yandex
Объявления
12.12.2013, 16:43     Сформировать массив слов из файла
Закрытая тема Создать тему
Опции темы

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