Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Kastel
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 5
#1

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

10.12.2013, 01:12. Просмотров 801. Ответов 11
Метки нет (Все метки)

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

STL сформировать массив множеств слов - C++
Создать и протестировать функцию void parse String (const string & src, vector & dst), которая сформирует массив множеств строк dst из...

Задача сформировать массив строк и реализовать функции определения количества слов - C++
Здравствуйте, помогите сделать задачи: 1. Сформировать массив строк. Удалить из него строки, начинающиеся на букву "а". 2....

Считать массив А с файла a.txt. после чего сформировать массив С в котором все отрицательные элементы с масси - C++
Помогите написать программу на C++. Изучала этот язык меньше пол года, пока есть проблемы. очень нужна ваша помощь Считать массив А с файла...

Сформировать новый файл, дописав в каждую строку исходного файла количество, содержащихся в ней слов. - C++
В каждой строке исходного файла имеется произвольное количество слов. Сформировать новый файл, дописав в каждую строку исходного файла...

Дана строка из 20 слов. Сформировать строку, составленную из последних букв всех слов исходной строки - C++
Задача: дана строка из 20 слов (или любого другого числа). Сформировать строку, составленную из последних букв всех слов исходной строки.

Функция, получает строку слов и рзделителей, а на выходе имеет массив слов из строки и количество этих слов - C++
мне нужна функция, которая во входе получает строку слов и рзделителей (" ", ",", ".", "_", """), а на выходе имеет массив слов из строки...

11
riki34
2 / 2 / 0
Регистрация: 10.11.2013
Сообщений: 24
10.12.2013, 07:10 #2
Есть функция такая, ifstream::readline(строка, к-во символов, стоп-символ);
Читает до стоп символа, то есть стоп символ можно поставить пробел, и знаки препинания и циклом считывать, пока !ifstream::eof();
А длину можно посчитать пройдясь перед этим по файлу с функцией ifstream::readline инкрементируя счетчик а читать в какую то левую строчку.
0
Kastel
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 5
10.12.2013, 16:18  [ТС] #3
Цитата Сообщение от riki34 Посмотреть сообщение
Есть функция такая, ifstream::readline(строка, к-во символов, стоп-символ);
Читает до стоп символа, то есть стоп символ можно поставить пробел, и знаки препинания и циклом считывать, пока !ifstream::eof();
А длину можно посчитать пройдясь перед этим по файлу с функцией ifstream::readline инкрементируя счетчик а читать в какую то левую строчку.
А массив слов как записать? Как массив указателей? Или как ступенчатый?
0
riki34
2 / 2 / 0
Регистрация: 10.11.2013
Сообщений: 24
10.12.2013, 18:05 #4
Цитата Сообщение от Kastel Посмотреть сообщение
А массив слов как записать? Как массив указателей? Или как ступенчатый?
Ну как массив указателей, типо
C++
1
char** a = new char*[n];
0
alsav22
5429 / 4824 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 18:38 #5
Цитата Сообщение от riki34 Посмотреть сообщение
ifstream::readline(строка, к-во символов, стоп-символ)
Это откуда, в ifstream, такая readline взялась?
0
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;
}
0
Ev[G]eN
iOS/Android Developer
Эксперт С++
5106 / 1544 / 382
Регистрация: 23.01.2011
Сообщений: 3,167
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;
}
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
0
alsav22
5429 / 4824 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 18:05 #9
Цитата Сообщение от riki34 Посмотреть сообщение
В Visual Studio спокойно работает
Какая судия? И, если можно, код. Потому, что смотрю я ifstream, и readline там не вижу. http://www.cplusplus.com/reference/fstream/ifstream/
0
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 минут
Никто не знает?
0
riki34
2 / 2 / 0
Регистрация: 10.11.2013
Сообщений: 24
11.12.2013, 20:44 #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Какая судия? И, если можно, код. Потому, что смотрю я ifstream, и readline там не вижу. http://www.cplusplus.com/reference/fstream/ifstream/
Щас не могу позже когда дома буду.
0
Памирыч
12.12.2013, 16:43     Сформировать массив слов из файла
  #12
 Комментарий модератора 
Закрыто. Причина: кросспостинг
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2013, 16:43
Привет! Вот еще темы с ответами:

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

Как прочесть несколько слов из файла в динамический массив char и добавить новое значение в конец? - C++
Никак не могу разобраться. Есть текстовый файл в виде: 3 Mop floor Clean windows Mow lawn цифра 3 это количесво...

Дан текст, состоящий не менее чем из пяти слов. Сформировать стек из тех слов, в которых присутствует буква "Е" - C++
Дан текст, состоящий не менее чем из пяти слов. Сформировать стек из тех слов, в которых присутствует буква &quot;Е&quot;. Я кое как составил...

Дан текст, состоящий не менее чем из пяти слов. Сформировать стек из тех слов, в которых присутствует буква "Е" - C++
Дан текст, состоящий не менее чем из пяти слов. Сформировать стек из тех слов, в которых присутствует буква &quot;Е&quot;. Помогите пожалуйста решить...


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

Или воспользуйтесь поиском по форуму:
12
12.12.2013, 16:43
Закрытая тема Создать тему
Опции темы

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