Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> файлы на Си, Исправьте пожалуйста код 
V
    Опции темы
aleksejj
Дата 24.11.2009, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 9.6.2009

Репутация: нет
Всего: нет



Нужно найти в файле самые длинные слова и вывести их на экран.Я могу только вывести одно слово,а остальные не могу!ПОМОГИТЕ ПОЖАЛУЙСТА.
Вот КОД--

Код

#include <stdio.h>
#include <string.h>
 
void main()
{
    char bigWord[256], buf[256],*nn="., ",*ll;
    size_t bigWordLength=0, bufLength;
    FILE *f,*g;
 
    bigWord[0] = '\0';
 
    f = fopen("test.txt", "r"); 
    g = fopen("est.txt", "w");
    if(f)
    {
        while(fscanf(f, "%255s", buf) != EOF)
        {   ll=strtok(buf,nn);
            bufLength = strlen(ll);
            if(bufLength > bigWordLength)
            {
                strcpy(bigWord, buf);
                bigWordLength = bufLength;
   }
        }
        if(bigWordLength == 0)
        {
            puts("File is empty");
        }
        else
        {
            printf("Big word: \"%s\" (Length: %u)\n", bigWord, bigWordLength);
        }
        fclose(f);
    }
    else
    {
        puts("Cannot open file");
    }
    getchar();
}

PM MAIL   Вверх
aleksejj
Дата 24.11.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 9.6.2009

Репутация: нет
Всего: нет



 smile 
PM MAIL   Вверх
V0LT
Дата 24.11.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.6.2009

Репутация: нет
Всего: 2



Код
#include <iostream>

int main(int argc, const char** argv) 
{
    char *str = "";
    char *buf = (char*)malloc(255);
    int n;
    FILE *f;
    if (!(f = fopen("main.cpp", "r"))) return -1;
    strcpy(buf,"");
    while ( fscanf(f, "%s", buf) != EOF )
    {
        char *tmp_str = (char*)malloc(strlen(buf));
        strcpy(tmp_str, buf);

        if ( strlen(tmp_str) == 0 ) continue;
        if ( strlen(tmp_str) >= strlen(str) ) 
        {
            str = tmp_str;
        }
    }
    printf("max = %s", str);
    return 0;
}


Может не очень красиво ... незнаю верно ли сделал или нет ... в С++ всего с августа этого года 
Не пинайте сильно я ещё учусь  smile 

Это сообщение отредактировал(а) V0LT - 24.11.2009, 19:39
PM MAIL ICQ   Вверх
aleksejj
Дата 24.11.2009, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 9.6.2009

Репутация: нет
Всего: нет



В принципе ты правильно сделал!Но только мне нужно вывести все слова из файла наибольшей длины.
Например это текст-
________________________
ааа 
   ииии


     чччч
   л

            
пппп
____________________________
Нужно вывести-
ииии,чччч,пппп-нужно вывести 3 слова!
PM MAIL   Вверх
V0LT
Дата 24.11.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.6.2009

Репутация: нет
Всего: 2



Тогда всё пихай в массив и сортируй методом пузырька по длине строки
PM MAIL ICQ   Вверх
aleksejj
Дата 24.11.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 9.6.2009

Репутация: нет
Всего: нет



Совсем заболтался!Вот что получилось-
Код

#include<iostream.h> 
#include<fstream.h>
#include<string.h>
 void main(){
    char s[250];
    char *word[250];
    char *tmp1,*max_s,*simv="., \n";
    int max=0,pp, k=0,r=0;
    ifstream g;
    ofstream t;
    g.open("1.txt");
    t.open("2.txt");
      if(!g){ cout<<"?RROR\n";  } 
    else
    while(!g.eof()){
    g.getline(s,250);
    tmp1=strtok(s,simv);
    while (tmp1){
    if(tmp1){
    word[k]=tmp1;
    k++;
    }
    tmp1=strtok(NULL,simv);
    } 

    cout<<"\n_+_+"<<k;
    
    max=strlen(word[0]);
    max-=2;
    for (int i=0;i<k;i++,max--)
        if (strlen(word[i])>max) {
        max=strlen(word[i]);
        max_s=word[i]; 
        pp=strlen(max_s); }
         
        for (i=0;i<k;i++) { 
        if(strlen(word[i])==pp) {
        cout<<"\n---"<<word[i];
        t<<"\n"<<word[i];}
        }
      }
       

t.close();
g.close();        
}

Но не правильно!
PM MAIL   Вверх
siew
Дата 25.11.2009, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 17.11.2009

Репутация: нет
Всего: нет



А где перевод указателя на следущую строчку? Или я не заметил?
PM MAIL   Вверх
xvr
Дата 25.11.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Код

#include <map>
#include <iostream>

int main(int, char**)
{
 std::string s;
 std::multimap<size_t,std::string> cnt;

 while(std::cin>>s) cnt.insert(std::make_pair(s.size(),s));
 if (cnt.empty()) {std::cout<<"No words!"<< std::endl; return 0;}

 size_t len=cnt.rbegin()->first;
 std::cout<<cnt.rbegin()->second;
 for(std::multimap<size_t,std::string>::reverse_iterator iter=cnt.rbegin(); ++iter!=cnt.rend() && iter->first==len;)
   std::cout<<","<<iter->second;
 std::cout << endl;
 return 0;
}



Это сообщение отредактировал(а) xvr - 25.11.2009, 17:52
PM MAIL   Вверх
aleksejj
Дата 25.11.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 9.6.2009

Репутация: нет
Всего: нет



ПОДСКАЖИТЕ ХОТЬ ЧТО-НИБУДЬ!!!! smile

Добавлено через 7 минут и 8 секунд
А на С код можно.А то я это не понимаю
PM MAIL   Вверх
bsa
Дата 25.11.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct ListNode
{
   char *data;
   struct ListNode *next;
} ListNode;

ListNode* listAdd(ListNode *node, char *data)
{
    ListNode *n = (ListNode*)malloc(sizeof(*n));
    n->next = node->next;
    node->next = n;
    n->data = data;
}

void clearList(ListNode *first)
{
    ListNode *next;
    while(first) {
      next = first->next;
      if (first->data != NULL)
         free(first->data);
      free(first);
      first = next;
    }
}

/*
возвращает указатель на память выделенную с помощью malloc,
в которой хранится слово или NULL, если конец файлы был
достигнут раньше начала слова
*/
char *readWord(FILE *f)
{
    char *word;
    char *p;
    char *e;
    //пропускаем пробелы
    while(1) {
       int c = fgetc(f);
       if (c < 0) //конец файла?
         return NULL;
       if ( !isspace(c) ) { //достигнуто начало слова
           ungetc(c, f);
           break;
       }
    }
    word = (char*)malloc(256);
    p = word;
    e = word + 255;
    for(; p != e; ++p) {
        int c = fgetc(f);
        if ((c < 0) || isspace(c)) //конец файла или пробельный символ
           break;
        *p = (char)c;
    }
    *p = '\0';
    return word;
}

int main()
{
   char *word;
   FILE *src = fopen("test.txt", "rt");
   if (src == NULL) {
       perror("Source file open failed:");
       return 1;
   }
   ListNode *first = (ListNode *)calloc(1, sizeof(*first));
   ListNode *cur = first;
   unsigned long max_size = 0;
   unsigned count = 0;
   while(1) {
      word = readWord(src);
      if (word == NULL)
         break; //конец файла
      cur = listAdd(cur, word);
      unsigned long size = strlen(word);
      if (size > max_size) {
         max_size = size;
         count = 1;
      } else if (size == max_size)
         ++count;
   }
   fclose(src);
   cur = first->next;
   free(first);
   first = cur;
   printf("Found %u words with size %lu:", count, max_size);
   for(; cur != NULL; cur = cur->next) {
      if (strlen(cur->data) == max_size)
         printf(" %s", cur->data);
   }
   puts("");
   clearList(first);
   return 0;
}

PM   Вверх
aleksejj
Дата 26.11.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 9.6.2009

Репутация: нет
Всего: нет



Спасибо всем за помощю,наконец-то у меня получилось.
Вот код,может кому пригодтся-
Код
#include<iostream.h> 
#include<fstream.h>
#include<string.h>
 void main(){
    char s[250];
    char *word[250],*vv[250];
    char *t1,*max_s,*simv="., \n";
    int max=0,pp,nn, k=0,r=0;
    ifstream g;
    ofstream t;
    g.open("1.txt");
      if(!g){ cout<<"?RROR\n";  } 
    else
    while(!g.eof()){
    g.getline(s,250);
    t1=strtok(s,simv);
    while (t1){
    if(t1){
    word[k]=t1;
    if (strlen(word[k])>max) {
    max=strlen(word[k]);
    max_s=word[k];           
    pp=strlen(max_s);
     }
    k++;
     }
    t1=strtok(NULL,simv);
      }
     } 
    g.close(); 
    cout<<"СЛОВА НАИБОЛЬШЕЙ ДЛИНЫ: ";
    g.open("1.txt");
    t.open("2.txt");
    t<<"СЛОВА НАИБОЛЬШЕЙ ДЛИНЫ: ";
    while(!g.eof()){
    g.getline(s,250);
    t1=strtok(s,simv);
    while (t1){
    if(t1){
    vv[r]=t1;
    nn=strlen(vv[r]);
    if(nn==pp){
    cout<<"\n"<<vv[r];
    t<<"\n"<<vv[r];}    
    r++;
     }
    t1=strtok(NULL,simv);
      }
      }
  
t.close();
g.close();        
}

 smile



Модератор: Не забываем пользоваться кнопочкой "Код"

Это сообщение отредактировал(а) bsa - 27.11.2009, 00:04
PM MAIL   Вверх
bsa
Дата 27.11.2009, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



aleksejj, ты просил программу на Си. А сам написал на С++. Ты в следующий раз определись с языком.

M
bsa
Если ответ на вопрос получен, то пометь тему решенной

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.