Школа создателей компьютерных игр

BannerDrive.ru
[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Чтение из файла



Подпишитесь на рассылку "Создание компьютерных игр"

Рассылки Subscribe.Ru
Создание компьютерных игр

Рассылка выходит раз в месяц.


Понравился сайт? Узнайте, как помочь сайту.


Рекомендуемые книги


Андре Ламот.
Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации


Андре Ламот.
Программирование игр для Windows. Советы профессионала


Проголосуйте за сайт в рейтинге GameTop!
(нажмите на кнопку рейтинга)

GameTop - рейтинг игровых ресурсов. Портал Rolemancer (www.rolemancer.ru)

Не забывайте, что результаты рейтинга обновляются раз в неделю. Пожалуйста, голосуйте почаще!


Статистика посещаемости

Rambler's Top100

Строки | Все обучалки раздела | Запись в файл

Описание

С помощью этой обучалки вы научитесь читать файлы ASCII (обычно имеющие расширение .txt).

Программа читает данные из текстового файла несколькими способами.

Скачать обучалку (Visual C++ 6)

Работа программы

Исходный код


//            - "Talk to me like I'm a 3 year old!" Programming Lessons -      
//                                                                            
//            $Author:            Ben Humphrey      digiben@gametutorials.com 
//                                                                            
//            $Program:            ReadingFiles                               
//                                                                            
//            $Description:      This gives several ways to read from a file  
//                                                                            
//            $Date:                  6/20/00                                 
//                                                                            

// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com

#include <stdio.h>       // Нам нужно подключить его для printf() и fgetc().

void main()        
{                        // Начало программы
      FILE *fp;
      
      /*  Эта новая переменная нужна для чтения файлов. 'fp' означает указатель на файл (filepointer).
            Нам нужен указатель, потому что fopen() возвращает адрес файла. Затем мы берем этот адрес,
            который указывает, в каком месте памяти хранится файл и читаем из него.
            Есть много файловых функций, но fopen самая простая и самая худшая. Она загружает весь файл
            целиком в память. Это плохая идея, если файл большой.      */
      
      char ch;      
      //      Мы создаем символьную переменную, для того чтобы читать файл символ за символом.

      char szLine[80]={0};      
      // Также мы создадим строку длиной 80 символов. Не забывайте использовать {0} для инициализации массива.

      int health=0, gold = 0;            
      // Создадим две целочисленных переменных, которые мы будем использовать для чтения здоровья и золота игрока.
                                                                              
      fp = fopen("Stats.txt", "r");                              

      /*      Так мы получим адрес размещения файла в памяти. Функция fopen() возвращает этот адрес.
            В качестве первого параметра ей нужно имя файла, а также буква в качестве второго.
            Есть много допустимых значений, "r" означает read-only (только для чтения).
            Если бы мы хотели открыть файл для записи, мы мы использовали "w" (write).
            Если бы мы хотели открыть его для двоичного чтения или записи, то использовали бы
            "rb" или "wb". Есть и другие значения.
      */      
      /*      Но прежде чем мы начнем чтение - нам нужно проверить, есть ли вообще этот файл.
            Если fp == 0, то это значит, что fopen() не может найти файл, или другую ошибку.
            Не забывайте, файл должен быть в той же директории, что и программа.      */
                                                                                    
      if(fp == 0)                                                            
      {                                                                              
            printf("ERROR: Could not find Stats.txt!\n");      
           // Напечатать сообщение об ошибке.
           // Это очень важно, особенно в больших проектах.
           // Можно потерять много времени, пытаясь узнать, почему программа не работает.
            return;      
            
            /*      Return работает так же как и break, только для функций а не для циклов.
                  Этот оператор выходит из текущей функции, в нашем случае это main, и поэтому программа
                  завершается.  */
      }                        
      
      printf("\n");                                                      

      while((ch = fgetc(fp)) != EOF)                              
            printf("%c", ch);                                                

      /*      В этом месте мы используем цикл для того, чтобы прочитать каждый символ из файла. EOF означает
            "конец файла" (End Of File). Функция fgetc() берет указатель на файл (fp) и возвращает каждый раз
            по одному символу. Этот символ мы сохраняем в переменной "ch", и затем печатаем полученное значение.
            В результате весь файл печатается на экране.
      
            В конце каждого файла компьютер помещает символ, чтобы отметить, что это конец файла. Я точно не
            помню, но я думаю, что это '\0' (нулевой завершающий символ) так же как и в строках.
            Каким бы не был этот символ, он определен директивой #define как EOF, что оозначает End-Of-File.
            Я поставил скобки вокруг (ch = fgetc(fp)) чтобы результат этого выражения мы могли сравнить с EOF.
            Не забывайте, '!=' означает "не равно". Итак, цикл while будет исполняться, пока мы не дойдем до EOF. */
                        
      printf("\n");                                                      

      rewind(fp);                                                      
      
      // Помните, как мы использовали эту функцию для очистки буфера ввода?
      // Мы можем также использовать ее для установки файлового указателя снова на начало файла.
                                                                              
      while(fgets(szLine, 80, fp))                              
            printf("%s", szLine);      

      /*      Это еще один способ чтения из файла. "fgets()" читает за один раз несколько символов.
            Этой функции нужна строка для хранения прочитанных символов, число символов, которое следует
            читать за один раз, и файловый указатель.
            Я выбрал 80 потому что это строка целиком, таким образом мы читаем по одной строке за один раз.
            fgets() сохраняет выбранное количество символов в "szLine"

            Затем мы выводим на печать 80 символов, которые хранятся в "szLine". Не забывайте, "%s" используется
            для строк. Этот цикл завершится, когда fgets() вернет NULL или EOF. (NULL означает нулевое значение)
            Мы можем поместить функцию в цикл while, например так "while(fgets(и т.д.))", потому что она будет
            возвращать строки. Когда она дойдет до конца файла, она вернет EOF - символ, который в выражении
            равен нулю. Таким образом условие while будет ложным и цикл завершится после печати файла на экран.
      */
      
      printf("\n");    

      rewind(fp);            
      // Вернем файловый указатель назад на начало файла, перед тем как я покажу еще один способ чтения.

      /*      Помните scanf()?  fscanf() это такая же функция, только она читает из файла, и вы можете указывать, 
            что вы хотите прочитать. Этой функции нужен указатель на файл, строка, которую следует искать, 
            тип читаемых данных, и переменная для хранения информации. fscanf() - хорошая функция. Если мы
            просто хотим получить данные об игроке, мы можем указать, какой текст следует искать в файле, 
            например "Player: ", который есть в нашем файле.
            Итак, мы говорим функции fscanf(), что нам нужна строка с именем, помещая "%s" после "Player:"
            Мы также поместим "\n" после %s потому что так мы укажем функции fscanf() перейти на следующую
            строку в файле. Теперь указатель находится на следующей строке файла.
            Кстати, когда что-либо читается с помощью файлового указателя, он увеличивает свое значение.
            Если мы читали символ, указатель будет находиться на следующем символе. Указатель не возвращается
            до тех пор, пока мы не вернем его с помощью rewind() или не закроем и вновь не откроем файл.
      */
            
      fscanf(fp, "Player: %s\n", szLine);                              
      // Так мы читаем имя игрока.

      fscanf(fp, "Health: %d\n", &health);
      // Так мы читаем "здоровье" игрока. Обратите внимание на оператор & (адрес). Нам нужно указать
      // функции fscanf() положение переменной "health" в памяти, потому что функции нужно изменить ее значение.
  
      fscanf(fp, "Gold: %d\n", &gold);
      // Здесь мы читаем количество "золота" игрока в переменную "gold". Мы также 
         // используем "&" чтобы получить разрешение изменить переменную.

      /*      Вы обратили внимание, что после строки "szLine" нет символа "&"? Вам не нужно 
            ставить "&" перед массивом, 
            так как для него уже подразумевается указатель на память. А строка - это массив символов.
      */

      printf("The Player's name is:   %s\n", szLine);
      // Здесь мы печатаем имя игрока, полученное из файла.

      printf("The Player's health is: %d\n", health);
      // А теперь мы печатаем здоровье игрока, которое мы получили из строки файла "Health: 50".

      printf("The Player's gold is:   %d\n", gold);
      // Затем мы печатаем количество золота игрока, которое мы получаем из строки "Gold: 20" файла "stats.txt".


      fclose(fp);      
      // fclose() закрывает файл (очень важно). Мы всегда должны закрывать файл после работы с ним. Это освобождает
      // память и вновь открывает доступ к файлу.
      
}                 // Конец программы.

//////////////////////////// Примечание о fscanf() //////////////////////////

/*
      Мы могли бы также проделать следующее с fscanf():
                                                                                    
      fscanf(fp, "Player Info: %s %d %d", szName, &health, &gold);

      Если бы у нас в файле было записано "Player: Adol 50 20", мы могли бы прочитать все это одной строкой.
      Еще одна хорошая особенность fscanf() - пробелы в файле не имеют значения.
      Например, у нас есть файл, который выглядит так "Player:         Adol"     
                                                                  
      fscanf(fp, "Player: %s", szLine);                        
      
      Так мы прочитаем эту строку. fscanf() проводит поиск до тех пор, пока не найдет символ.
      Неважно, если перед этим будут пробелы или символы табуляции.

      Я полагаю, мы можем также сделать следующее:
                                                                              
      fscanf(fp, "Player: %s\nHealth: %d\nGold: %d\n", szLine, &health, &gold);

      Так мы прочитаем весь файл одной строкой. Еще раз, "\n" означает новую строку. У каждого текстового файла
      в конце строки стоит "\n", чтобы программа поняла, что строка окончена.

*/
// © 2001 GameTutorials
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com

Скачать обучалку (Visual C++ 6)

Строки | Все обучалки раздела | Запись в файл

[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Copyright © 2003-2005 Евгений Казеко. Все права защищены. E-mail: evgeniy@kazeko.com

материал дорнит , Решили построить дом? проектирование дома под ключ для удобного проживания. , стеклоблоки