2012-06-22 5 views
1

Программа, над которой я работаю, создает файл (about.txt), который включает в себя раздел рекорда.Как читать переменную из файла

В строке 12 .txt является ...

Plain Text (без рекордов):

- with <0> 

C:

fprintf(about,"-%s with <%ld>",highname,highscore); 

мне нужно прочитать партитуру файл и тест, чтобы увидеть, если он больше текущего рекорда, прежде чем писать новый.

мне нужно ...

if(score > highscore) 
    highscore=score; 

Единственная проблема заключается в том, как я могу получить от топ-лист файла.

Я провел некоторое исследование самостоятельно и уверен, что это намного проще, чем я делаю это, но когда я огляделся, я не смог найти способ сделать это.

спасибо. ///////////////////////////////// EDIT /////////////// ///////// Создание файла:

FILE *about; 
    fpos_t position_name; 
    fpos_t position_score; 
    ... 
    fprintf(about,"\n\nHIGHSCORE:\n\n"); 
    fprintf(about,"-"); 
    fgetpos(about,&position_name); 
    fprintf(about,"%s",highname); 
    fprintf(about,"with"); 
    fgetpos(about,&position_score); 
    fprintf(about,"%ld",highscore); 
    fclose(about); 
    ... 

Получение баллов:

 FILE *about; 
     about = fopen("about.txt","r"); 

     fseek(about,position_name,SEEK_SET); 
     fscanf(about,"%s",highname); 
     fseek(about,position_score,SEEK_SET); 
     fscanf(about,"%ld",highscore); 
     fclose(about); 

Изменение переменных (примечание .. Топ-лист/highname являются глобальные переменные)

if(score >= highscore) //alter highscore 
    { 
     highscore = score; 
     highname = name; 
     puts("NEW HIGHSCORE!!!\n"); 
    } 

Я получаю сообщение об ошибке:

error: incompatible types when assigning to type 'char[3]' from type 'char' 

На этой линии:

highname = name; 

Имя/оценка/highname/Топ-лист объявлен здесь (в заголовочном файле):

char name[3]; 
char highname[3]; 
long score; 
long highscore; 
+0

Что именно вы испытываете трудности с? Открытие файла, получение данных из него, чтение/синтаксический анализ текстовой строки после ее вставки, преобразование текста в числовое значение? Что-то другое? –

+0

Вы должны использовать функцию fscanf. Он определен в той же библиотеке, что и fprintf. – Wug

ответ

0

Вы можете использовать fscanf «s малоизвестной, но очень мощное средство, регулярное выражение, вместе с его способностью пропускать записи на основе регулярных выражений:

открыть файл и пропустить первые 11 строк в цикле. Потом прочитал счет, как это:

FILE *f = fopen("about.txt","r"); 
int i, score; 
char buf[1024]; 
for (i = 0 ; i != 11 ; i++) { 
    fgets(buf, 1024, f); 
} 
fscanf(f, "%*[^<]%*[<]%d", &score); 
printf("%d\n", score); 

Это будет пропускать все в файле, вплоть до открытия < кронштейна, а затем пропустить саму скобу, и прочитать запись целого числа. Обратите внимание, что %* в строке формата обозначает запись, которая должна быть пропущена fscanf. Here is a snippet at ideone.

EDIT - В ответ на дополнительный вопрос от вашего редактирования: вы не можете назначить массивы, как это, вы должны использовать вместо memcpy:

memcpy(highname, name, 3); 
+0

когда я пытаюсь сказать, что он говорит об ошибке: expected ')' перед числовой константой – Bevilacqua

+0

@Bevilacqua У вас тогда есть синтаксическая ошибка. Если вы опубликуете изменения в редактировании, я думаю, мы сможем это заметить. – dasblinkenlight

+0

Я сделал это memcpy (имя, имя, 3); ... но если я сделаю то, что вы предложили, я не смогу полностью избежать этого. Если это не массив, он не будет работать в других частях программы. Я немного запутался в том, как делать то, что вы предложили – Bevilacqua

0

Вы должны будете использовать fscanf, чтобы сделать это; это немного похоже на инверсию fprintf.

Посмотрите на документацию здесь: http://cplusplus.com/reference/clibrary/cstdio/fscanf/

+0

Посмотрите на мое главное сообщение ниже строки редактирования, пожалуйста, – Bevilacqua

+0

Я забыл упомянуть в своем редактировании, также получаю предупреждение: format '% ld' ожидает аргумент типа long int *, но аргумент 3 имеет тип long St – Bevilacqua