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

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

Восстановить пароль Регистрация
 
lanc3r
0 / 0 / 0
Регистрация: 17.12.2009
Сообщений: 98
20.12.2011, 00:20     Списки, чтение и вывод информации в файл #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 минут
смысл тогда создавать такой форум? не понимаю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2011, 00:20     Списки, чтение и вывод информации в файл
Посмотрите здесь:

C++ ID3 tag и чтение информации из него
C++ Чтение информации с открытой в браузере страницы!
C++ Вывод в файл и последующее чтение из файла объектов класса
C++ Задание на чтение, вывод в файл
C++ Чтение информации из файла
C++ Чтение бинарного файла в поток std::ifstream и вывод в другой бинарный файл std::ofstream (создание копии)
Дописать чтение и вывод в файл C++
Чтение информации из файла C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vikichocolate
 Аватар для vikichocolate
25 / 14 / 1
Регистрация: 11.11.2011
Сообщений: 94
20.12.2011, 00:35     Списки, чтение и вывод информации в файл #2
ты не одинок...мне тож никто не помогает
lanc3r,
Yandex
Объявления
20.12.2011, 00:35     Списки, чтение и вывод информации в файл
Ответ Создать тему
Опции темы

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