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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из файла, исходник 
:(
    Опции темы
CrasyMen
Дата 5.4.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть исходник:
Код
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define size 1000
int print( FILE *file, int sum ); // печать вопроса и ответов с чтением из файла sum - стоимость
int position( FILE *file, char *str ); // позиционирование
void out(); // печать вопросов и ответов
void clear(); // очистка состояния ответов answer[4]
void help(); // функция "помощь зала" (незаполнена)
void bell(); // функция "звонок другу" (незаполнена)
void _50x50( char num ); // функция "50x50" (сделана)
char question[size]; // вопрос
typedef struct ANSWER{
    char an[size]; // ответ
    // состояние ответа (если невыбраны то все равны нулю):
    int help; // 1) процент проголосовавших при "помощи зала"
    int bell; // 2) bell = 1, если ответ выбран "другом" (звонок другу)
    int _50x50; // 3) _50x50 = 1, если удалён !
}Answer;
Answer answer[4]; // всего может быть 4 ответа ...
//////////////////// Main ////////////////////////////////////////
int main(){
    srand((unsigned)time(NULL));
    setlocale(LC_CTYPE, "Russian"); // для русских букв
    FILE *file = fopen("text.txt", "r"); // открываем файл с вопрос-ответами
    if( !file ){
        puts("Error open file !");
        getchar();
        return 1;
    }
    const int count = 3; // 3 стоимости (100, 200, 300)
    int answer[count] = { 100, 200, 300 };
    char num, nom;
    int i;
    for( i=0; i<count; i++ ){ // перебираем все "стоимости"
        printf("Вопрос стоимостью %d\n", answer[i] );
        num = print( file, answer[i] ); // читаем какой-нибудь вопрос из текущей стоимости
        do{
            printf("\n\nВведите правильный ответ > ");
            scanf("%c", &nom );
            switch( nom ){
                case '1': help(); break;
                case '2': _50x50(num); break;
                case '3': bell(); break;
                case '4': exit(0); break;
                default: break;
            }
        fflush(stdin);
        }while( nom > '1' && nom < '4' );
        if( num != nom )
            printf( "Неправильно !!!\n\n" );
        else
            printf( "Правильно !\n\n" );
        fflush(stdin);
    }
    fflush(stdin);
    getchar();
    return 0;
}
////////////////// End main /////////////////////////
int print( FILE *file, int sum ){
    fseek( file, 0, 0 ); // позицыонирование в начало файла
    int pos, count, num, i;
    char an;
    char buf[size];
    // поиск стоимости
    while(1){
        pos = position( file, "стоимость" );
        if( !pos ) return 0; // error
        if( pos == sum ) break;
    }
    // поиск вопроса
    if( fscanf( file, ":%d", &count ) <=0 ) return 0;
    num = rand()%count +1; // выбираем вопрос из возможных
    while( position( file, "вопрос" ) != num );
    fscanf( file, ">%[^<]s", question );
    // поиск ответов
    fscanf( file, "%*[^<]" );
    fscanf( file, "<ответ %c>\n", &an ); // правильный ответ (a, b, c, d)
    for( i=0; i<4; i++ ){
        fscanf( file, "%[^\n]s", answer[i].an );
        fscanf( file, "%*[\n]" );
    }
    clear();
    out(); // вывод считанного из файла
    return an;
}
/////////////////////////
int position( FILE *file, char *str ){
    char buf[100];
    int pos;
    fscanf( file, "%*[^<]" );
    fscanf( file, "<%s", buf );
    if( strcmp( buf, str ) != 0 )
        return -1;
    if( fscanf( file, "%d", &pos ) <=0 )
        return 0;
    return pos;
}
////////////////////////////////////
void clear(){
    int i;
    for( i=0; i<4; i++ )
        answer[i].help = answer[i]._50x50 = answer[i].bell = 0;
}
/////////////////////////////
void out(){
    puts( question ); // вывод вопроса
    int i;
    for( i=0; i<4; i++ ){
        if( answer[i]._50x50 ) // если вопрос удалён
            printf( "((%s)) - вопрос удалён !", answer[i].an );
        else printf( "%s", answer[i].an ); // вывод ответа
        if( answer[i].help ) // если для вопроса "была помощь зала"
            printf( " > помощь зала: %d %%", answer[i].help );
        if( answer[i].bell ) // если вопросу "помог звонок другу"
            printf( " > помощь друга !" );
        puts(""); // перевод строки
    }
}
///////////////////////////////////
void _50x50( char num ){
    char a, b;
    do{
        a= rand()%4 + 'a';
    }while( a == num );
    do{
        b = rand()%4 + 'a';
    }while( b == a || b == num );
    answer[ a - 'a' ]._50x50 = 1;
    answer[ b - 'a' ]._50x50 = 1;
    out(); // вывод вопроса
}
///////////////
void help(){;}
void bell(){;}


ФАЙЛ
Код

<стоимость 100:3><!-- на 100 рублей 3 вопроса -->
<вопрос 1> Сколько будет два умножить на два ?
<ответ c>
a) один
b) два
c) четыре
d) десять
<вопрос 2>Сколько будет один плюс один ?
<ответ b>
a) один
b) два
c) десять !
d) 100
<вопрос 3>Сколько на двух руках пальцев ?
<ответ d>
a) один
b) два
c) четыре
d) десять
<!-- конец вопросов на 100 рублей>
<!--______________________________-->
<стоимость 200:2><!-- на 200 рублей 2 вопроса-->
<вопрос 1>Два плюс два ?
<ответ c>
a) один
b) два
c) четыре
d) 100
<вопрос 2>Один плюс два ?
<ответ d>
a) один
b) два
c) ноль
d) три
<!-- на 200 руб больше нет-->
<!--_________________________-->
<стоимость 300:1><!-- на три сотни 1 вопрос -->
<вопрос 1>Сколько будет если прибавить один и два, 
а потом вычесть один,
а потом ещё прибавить два ?
<ответ b>
a) один
b) четыре
c) три
d) 100
<вопросов нет><!-- конец дорумента -->


не совсем понимаю:

Код

fscanf( file, "%[^\n]s", answer[i].an );
fscanf( file, "%*[\n]" );


объясните пожалуйста как работает "%[^\n]s" и "%*[\n]"  


--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках.
[color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
PM MAIL ICQ   Вверх
regis
Дата 5.4.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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




Смотрим например http://www.manpages.com/man/fscanf

Код

%[^\n]s


Последовательность любых символов, исключая конец строки.

Код

%*[\n]


А здесь не должно быть s в конце?
Эффект обратен предыдущему: любая последовательность \n.
Префикс * означает подавление присваивания.

--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
Earnest
Дата 5.4.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(regis @  5.4.2007,  15:35 Найти цитируемый пост)
А здесь не должно быть s в конце?

Явно должно...

regis, а ты и правда про скобочки [] в спецификации формата помнишь? Уважаю... 
Я так каждый раз в хелп лазаю, чтобы написать что-то сложнее %*.f


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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