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

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

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

Списки, чтение и вывод информации в файл - C++

20.12.2011, 00:20. Просмотров 652. Ответов 1
Метки нет (Все метки)

программа подсчета количества повторений всех слов,
встретившихся в файле, заданном первым аргументом командной
строки, и записи полученных результатов в файл, имя которого
задается вторым аргументом. Для ускорения работы программы
найденные слова необходимо хранить в отсортированном связном
списке.
Вопрос такой. Программа выдает общее количество слов во входном файле и выдает кол-во различных слов. Мне же нужно сделать так - вводится слово с клавиатуры ( для начала предположим,что оно точно есть в списке, т.е. работаем мы уже тогда, когда список составлен и отсортирован, но еще во второй файл информацию не вывели), нужно вывести на экран 3 слова, соответствующих трем предыдущим элементам списка ( от найденного нами) и 3 следующим, если их нет ( то есть NULL), то не выводить их естественно. Хочу сначала справиться хотя бы с этим, сначала приведу свой неправильный вариант решения, дальше будет идти сама программа изначальная без самого задания
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
   char vvod[255];
    struct CLIST *cur,*d,*b,*c;  // struct CLIST//тип данных CLIST (вот так у меня задается структура двусвязаного списка)
      // {
        //CLIST *next; // адрес следующей структуры в списке
        //CLIST *prev; // адрес предыдущей структуры в списке
        //char *word;
        //int count;
      // };
struct CLIST *startL=NULL,*endL=NULL;//startL, endL указатели на структуру типа CLIST
    cout<<"Vvedite clovo"<<" \n";
    cin>>vvod;
    for (cur=startL;cur != NULL;cur->next) //идем от начала до конца, ищем слово)
        { if (cur->word==vvod)
        d=cur;}  //нашли, присвоели его d
    b=d;
    c=d;
    for (int i=0;i != 3;i++)  //3 вверх и 3 вниз ( 3 предыдущих и 3 следующих)
      {b=b->prev;
        c=c->next;
        if (b != NULL)
            cout<<b->word<<" \n";
        if (c != NULL)
            cout<<c->word<<" \n";
    }
но работать категорически не хочет ( не понимаю почему.

А вот и программа(начальные условия):

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include "stdafx.h"
#include <iostream>
#include <fstream>
 
 
 
// Функция возвращает true если встретился разделитель слов
unsigned char terminators[]=" \n,:;().\"";
bool isTerminator(unsigned char ch)
{
 for (unsigned char *p=terminators;*p!=0;p++)
 {
     if (ch==*p)
         return true;
 }
 return false;
 
  
}
#define MAXWORDLENGTH 65535
 
 struct CLIST//тип данных CLIST
       {
        CLIST *next; // адрес следующей структуры в списке
        CLIST *prev; // адрес предыдущей структуры в списке
        char *word;
        int count;
       };
struct CLIST *startL=NULL,*endL=NULL;//startL, endL указатели на структуру типа CLIST 
 
void processWord(char *buffer)
    {
        struct CLIST *p,*q;
        if (*buffer==0)// строка пустая(нулевая)
            return;
        for (p=startL;p != NULL;p=p->next)
        {
            int cmp=strcmp(p->word,buffer);// (-1) если первое слово меньше второго, buffer слово из файла
            if (cmp==0)// слово уже есть в массиве
            {
                p->count++;
                return;
            }
            if (cmp==1)// нашли слово большее нашего
                break;
        }
        q=new CLIST;// новая структура для нового слова
        q->count=1;
        q->word=_strdup(buffer); //нельзя присваивать buffer, его содержимое поменяется при следующем чтении
        // _strdup - адрес копии слова из buffer
        if (p!=NULL) //вставляем перед p
        {
            q->next=p;
            q->prev=p->prev;
            p->prev=q;
            if (startL != p) //вставка не в начало
                q->prev->next=q;
            else //вставка в начало
                startL=q;
            return;
        }
        //вставка в конец, p=NULL, пробежали весь список и ничего не нашли
        if (startL==NULL)//список пустой, самое первое слово
        {
            startL=endL=q;
            q->next=q->prev=NULL;
        }
        else// если текущее слово больше всех остальных
        {
            q->prev=endL;
            q->next=NULL;
            endL->next=q;
            endL=q;
        }
    }
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
 
    if(argc != 3) // в командной строке должно быть 2 параметра
    {  // вывод справочной информации
        cout<<"Using : laba_4 file_from file_to";
        return 1; // закончить программу
    }
 ifstream from(argv[1]); // открываем входной файл
 if (!from)
 {
  cout<<"Не открывается входной файл :"<<argv[1]<<endl;
  return 1;
 }
 
 ofstream to(argv[2]); // открываем выходной файл
 if (!to)
 {
  cout<<"Не открывается выходной файл :"<<argv[2]<<endl;
  return 1;
 }
 
 int ch=0,count=0; // переменная для хранения очередного символа
 char buffer[MAXWORDLENGTH],*pBuffer;
 bool inWord=false;
 while ((ch = from.get()) != EOF) // Цикл чтения и обработки очередного
                                  // символа, get-считать 1 символ
 {
    bool isTerm=isTerminator(ch);
    if (inWord==false) //мы не в слове
    {
        if (isTerm)
            continue;
        //значащий символ
        inWord=true;
        pBuffer=buffer;
        count=0;
        
    }
    //inWord==true; мы в слове
    if (isTerm==false)
    {
        if (count>=MAXWORDLENGTH)
        {
            cout<<"Sorry word is too long"<<endl;
            return 1;
        }
        *pBuffer++=(char)(ch);//символ в буфер
        count++; //для слишком больших слов
        continue;       
    }
    //isTerm==true;
    *pBuffer=0;
    inWord=false;
    processWord(buffer);    
 }
 //Не забыть про последнее слово
 *pBuffer=0;
 if (inWord)
    processWord(buffer);
 int TotalWords=0,DifferentWords=0;
 struct CLIST *p,*a;
 
 for (p=startL;p != NULL;p=a)
 {
        to<<p->word<<endl;
        TotalWords+=p->count;
        DifferentWords++;
        free(p->word); //то что выделено strdup-ом надо освобождать free.
        a=p->next;
        delete p;
 }
 startL=endL=NULL;
 to.close();
 cout<<"Total Words:" <<TotalWords<<endl;
 cout<<"Different Words:" <<DifferentWords<<endl;
 return 0;
}
Добавлено через 10 часов 8 минут
может кто помочь? сказать в чем ошибка, хоть какая-нибудь помощь нужна...

Добавлено через 23 часа 5 минут
смысл тогда создавать такой форум? не понимаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2011, 00:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Списки, чтение и вывод информации в файл (C++):

Чтение и вывод информации из файла - C++
Имеется текстовый файл zarplaty.txt. Необходимо вывести содержимое файла на экран в консоль.(объясните ещё как с русским языком обстоит...

Не работает вывод информации в файл в switch() - C++
При выводе информации в файл при помощи getline в main() функции вывод работает, но при помещении операции в switch() выходит &quot;Перегрузка&quot;....

Дописать чтение и вывод в файл - C++
Словом текста считается любая последовательность цифр и букв русского алфавита длиной не более 6 символов; между соседними словами - не...

Задание на чтение, вывод в файл - C++
Прошу о помощи. Вот задание: &quot;В файле trialin записано матрицу NxN. Найдите ее детерминант. Результат запишите в trialout. Для работы с...

Добавить вывод в файл и чтение из файла объектов класса - C++
Добавить вывод в файл и чтение из файла объектов класса. Работа должна отображаться на мониторе. Прошу не много подсабить. #include...

Вывод в файл и последующее чтение из файла объектов класса - C++
Как наиболее правильно и канонично выводить (так чтобы потом ещё и прочитать) объекты классов в файл? Представим ситуацию: Есть класс...

1
vikichocolate
25 / 14 / 1
Регистрация: 11.11.2011
Сообщений: 94
20.12.2011, 00:35 #2
ты не одинок...мне тож никто не помогает
lanc3r,
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2011, 00:35
Привет! Вот еще темы с ответами:

Считывание из файла и вывод на экран (сохранение записанной в программе информации в файл) - C++
Вот сама задача: Анкета для опроса населения содержит две группы вопросов. Первая группа содержит сведения о респонденте: 1)возраст 2)пол...

Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод) - C++
Добрый вечер! Возникла такая проблема, что при добавлении записи, удаляются уже имеющиеся записи в файле. Также не помешала бы помощь в...

Чтение файла (с кракозябрами) с однобайтовой кодировкой, конвертация в UTF-8 и вывод в другой файл - C++
Добрый день, форумчане. Может у кого есть заготовка или кто поделится советом, необходимо прочитать файл (с кракозябрами) с однобайтовой...

Ввод информации и вывод информации на экране - C++
Используйте две переменные типа float, предложите пользователю ввести два числа и выведите на экран четыре строчки (сумма, разность,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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