Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] Работа с текстовыми файлами


Автор: tema462 13.1.2007, 22:55
 smile 

Задан текстовый файл из этого файла нужно сформировать массив слов и сортировать массив слов с соответствием кол-ва букв по убыванию! 
Помоги плз студенту сдать экзамен! smile  smile 

Автор: Xenon 13.1.2007, 23:52
[UPDATE]
Млин, про сортировку забыл ... Сейчас ...
[UPDATE2]
Код

#include <cstring>
#include <vector>

using std::string;

typedef std::vector<string> WordArr;

void Get_Words (FILE* file,WordArr& arr)
{
    string word;
    char ch;
    while (!feof(file))
    {
        fread(&ch,1,1,file);
        if (ch==' ')
        {
            arr.push_back(word);
            word.clear();
        }
        else
        {
            word+=ch;
        }
    }
}

int main(int argc, char* argv[])
{
    char path[256];
    printf("Enter Path to file: ");
    scanf("%s",path);
    FILE* file;
    file=fopen(path,"r");
    WordArr arr;
    Get_Words(file,arr);
    for (int j=1,i=0;j<arr.size();j++)
    {
        string temp=arr[j];
        for (i=j-1;i>=0 && (strcmp(arr[i].c_str(),temp.c_str())>0);i--)
        {
            arr[i+1]=arr[i];
        }
        arr[i+1]=temp;
    }
    for (int i=0;i<arr.size();i++)
    {
        printf("%s ",arr[i].c_str());
    }
    return 0;
}

Автор: tema462 14.1.2007, 01:29
У мя етсь тут пару идей:
1)3 функции поиск, сортировка, вывод на экран
2)поиск 2 цикла вложенных один по пробелу реагирует другой забрасывает символы в служебный массив
3)сортировка вложенный цыкл сравнивает служебный массив с списком слов в конечном массиве, а внешний сортирует массив слов 
4)функция выводит на эран список слов из массива ВСЕ!
Если кто подхватит идеи или свои придумает, я не уверен что они правильные всмысле свои, и напишет прогу на СИ, буду очень благодарен!

Добавлено @ 01:32 
 smile 

Автор: Oleg_Ci 14.1.2007, 08:44
 smile 
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define len 100 // максимальная длинна читаемых слов из файла

int read_string( FILE * file, char *** matrix ); // чтение слов из потока
void write_string( FILE * file, const char ** matrix, int size ); // вывод слов в поток
void sort_string( const char ** matrix, int size ); // сортировка

////////////////////////// MAIN /////////////////////////////
int main(){
    FILE * file = fopen( "text.txt", "r" ); // открываем файл с текстом
    if( !file )
        puts("Error open file !");
    else{
        char ** str;
        int size = read_string( file, &str );
        sort_string((const char**) str, size );
        write_string( stdout, (const char**) str, size );
    }
    puts("\n\n\nPress key Enter no continue");
    getchar(); // пауза
    return 0;
}
///////////////////// END MAIN /////////////////////////

//// чтение //////////////
int read_string( FILE * file, char *** matrix ){
    char buf[len]; // сюда читаем слово из файла
    int size = 0; // количество слов в массиве
    int max_size = 10;
    *matrix = (char**) calloc ( max_size, sizeof(char*));

    while( fscanf( file, "%s", buf ) >0 ){
        if( size >= max_size ){ // если нехватило памяти
            max_size += 10; // ещё 10 слов
            char ** mas = (char**) malloc ( max_size*sizeof(char**)); // увеличенный массив
            memcpy( mas, *matrix, sizeof(char*)*(max_size-10)); // копируем адреса строк
            free( *matrix ); // удаляем старые адреса
            *matrix = mas; // увеличили массив на 10 слов
        }

        char * m = (char*) malloc ( strlen( buf )+1 );
        (*matrix)[size] = m;
        strcpy( (*matrix)[size], buf );
        size++;
    } // end read string

    *matrix = (char**) realloc ( *matrix, size*sizeof(char*)); // урезаем массив до количесва слов    
    return size;
}
//////// вывод /////////
void write_string( FILE * file, const char ** matrix, int size ){
    int i;
    for( i=0; i<size; i++ )
        fprintf( file, "%s\n", matrix[i] );
}
////// сортировка /////////
void sort_string( const char ** matrix, int size ){
    int i, j;
    const char * str;
    for ( i=0; i < size; i++){
        str = matrix[i];
        size_t a = strlen( str );
        for( j=i-1; j>=0 && strlen( matrix[j] ) > a; j-- )
            matrix[j+1] = matrix[j];
        matrix[j+1] = str;
    }
}

Автор: Xenon 14.1.2007, 14:50
Oleg_Ci, в C есть String?..

Автор: tema462 14.1.2007, 15:24
Цитата(Xenon @ 14.1.2007,  14:50)
Oleg_Ci, в C есть String?..

да есть! smile 

Автор: tema462 14.1.2007, 16:59
Цитата(Oleg_Ci @ 14.1.2007,  08:44)
smile 
Код

    *matrix = (char**) calloc ( max_size, sizeof(char*));


что это такое? smile 

Автор: Xenon 14.1.2007, 17:15
Ну тогда в моем примере надо было лишь вектор выкинуть smile А я-то думал ...

Автор: tema462 14.1.2007, 18:47
FILE * file = fopen( "text.txt", "r" ); // открываем файл с текст
Здесь нужно нисать адрес тестового файла,вместо ("text.txt", "r") smile 

Автор: Xenon 14.1.2007, 21:28
tema462, эээ? Можешь вставить переменную, вместо конкретного имени

Автор: tema462 14.1.2007, 21:32
что куда встватиь?
Цитата

FILE * file = fopen( "text.txt", "r" ); // открываем файл с текст
Здесь нужно нисать адрес тестового файла,вместо ("text.txt", "r")   

ты про это smile

Добавлено @ 21:35 
Xenon, а ты в аське сидишь ваще? smile 

Автор: Oleg_Ci 17.1.2007, 13:09
Я два дня не мог на форум попасть, что-то здесь ремонтировали наверное, у меня не отображалась "кнопка отправить" и не мог ничего написать.
 smile хотя другие писали посты почему-то, а у меня проблемы...
Цитата
 в C есть String?

класса string конечно нету, а затоловок <string.h> есть, с функциями для char* -строк.
Код

*matrix = (char**) calloc ( max_size, sizeof(char*));

Тут выделяем память для указателей на строки, кождый указатель будет указывать на начало строки smile 
Цитата(tema462 @  14.1.2007,  21:47 Найти цитируемый пост)
FILE * file = fopen( "text.txt", "r" ); // открываем файл с текстЗдесь нужно нисать адрес тестового файла,вместо ("text.txt", "r")   smile 

к сожалению что такое -> "адрес тестового файла" я не знаю...

Автор: _mortar89 4.4.2007, 18:48
Народ, проблема такая, делаю программу шифрования и есть необходимость удалить определенное количество символов с конца текста, пример: "пользователь вводит -10" и 10 символов должно удалится с конца текста. Вот выкладываю кусок  кода, что не так в нем?

Код


 if(End<0){
     for( i=End; i<0; i++){
         Byte = fgetc(fpInput);
          Byte=Byte-1;
       }
     }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)