// - "Talk to me like I'm a 3 year old!" Programming Lessons -
//
// $Author: Ben Humphrey digiben@gametutorials.com
//
// $Program: WritingFiles
//
// $Description: This gives several ways to write to a file
//
// $Date: 6/22/00
//
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
#include <stdio.h> // Нам нужно включить этот файл для printf() и fgetc().
#include <string.h> // Этот нужен для strlen()
void main()
{ // Начало программы
FILE *fp;
// Эта переменная будет использоваться для записи в файл. Еще раз, 'fp' (filepointer) означает указатель.
char szLine[50] = {0};
// Эта используется для хранения текста, который будет записываться в файл. Не забывайте использовать {0}
// для инициализации массивов.
char szName[] = "Adol";
// Здесь мы инициализируем имя игрока. Длина этого символьного массива - 4 символа.
// Если не указывать число в квадратных скобках, создается массив с числом элементов равным числу символов.
int health = 100, gold = 75;
// Две целочисленные переменные, которые мы будем использовать для записи золота и здоровья игрока в файл.
int length = 0;
// Переменная для хранения длины выводимой строки.
int i = 0;
// Переменная-счетчик
fp = fopen("Stats.txt", "w");
/* Так мы получаем адрес памяти, где располагается файл.
И снова, функции нужны имя файла и буква.
На этот раз, так как мы хотим записать в файл, мы используем "w".
Если на диске уже есть файл "stats.txt", его содержимое перед записью будет удалено.
Если вы хотите добавить данные в файл, используйте "а". Тогда файл не будет стерт. */
/* Теперь, у нас должен быть корректный файловый указатель, но мы должны удостовериться в этом.
Если fp равно 0, это значит fopen() не смогла создать файл. Такое может быть потому что у
нас недостаточно памяти или места на диске.
*/
if(fp == 0)
{
printf("ERROR: Could not create Stats.txt!\n");
// Напечатать сообщение об ошибке. Это очень важно, особенно в больших проектах.
return; // Завершение функции и программы
}
////////////////////// FPUTC() //////////////////////////
sprintf(szLine, "Player: %s", szName);
/* Sprintf() работает почти так же как и printf(), только данные выводятся не на экран а в буфер или строку.
В данном случае мы сохраняем имя игрока в строку, которая выглядит вот так: "Player: Adol".
Параметры: строка, куда сохраняются данные, строка, которая сохраняется, данные для вставки в строку.
Так же как и в printf(), мы можем использовать несколько параметров для данных, например
sprintf(szLine, "%d %d %d", num1, num2, num3);
*/
length = strlen(szLine);
// Здесь мы используем функцию для того чтобы узнать количество символов нашей новой строки.
for(i = 0; i < length; i++)
{
fputc(szLine[i], fp);
}
/* Здесь мы создаем цикл для записи каждого символа в файл.
Мы продолжаем, до тех пор пока i не будет превышать length (индексы массивов начинаются с нуля).
Как и fgetc(), fputc() записывает один символ в файл. И после того, как цикл завершится, в файле будет
строка "Player: Adol".
*/
fputc('\n', fp);
// Так мы поместим файловый указатель на следующую строку текстового файла.
sprintf(szLine, "Health: %d", health);
// Здесь создается строка, которая выглядит так: "Health: 100". Затем мы можем сохранить ее в файл.
length = strlen(szLine);
// Еще раз используем функцию для того чтобы узнать количество символов нашей новой строки.
for(i = 0; i < length; i++)
{
fputc(szLine[i], fp);
}
/* Здесь мы создаем цикл для записи каждого символа в файл.
Мы продолжаем, до тех пор пока i не будет превышать length (индексы массивов начинаются с нуля).
На этот раз мы пишем строку "Health: 100". После того, как цикл завершится, в файле будет 2 строки
*/
fputc('\n', fp);
// Так мы поместим файловый указатель на следующую строку текстового файла.
sprintf(szLine, "Gold: %d", gold);
// Здесь создается строка, которая выглядит так: "Gold: 75". Затем мы можем сохранить ее в файл.
length = strlen(szLine);
// Еще раз используем функцию для того чтобы узнать количество символов нашей новой строки.
for(i = 0; i < length; i++)
{
fputc(szLine[i], fp);
}
/* Здесь мы создаем цикл для записи каждого символа в файл.
Мы продолжаем, до тех пор пока i не будет превышать length (индексы массивов начинаются с нуля).
На этот раз мы пишем строку "Gold: 75". После того, как цикл завершится, в файле будет 3 строки.
*/
////////////////////// FPUTS() //////////////////////////
fputc('\n', fp);
fputc('\n', fp);
sprintf(szLine, "Player: %s", szName);
fputs(szLine, fp);
/* Как и fgets(), эта функция берет строку целиком, а не только отдельный символ.
Она запишет строку в файл. Нужно просто передать ее, а также указатель.
*/
fputc('\n', fp);
sprintf(szLine, "Health: %d", health);
fputs(szLine, fp); // Сохраняем в файл "Health: 100".
fputc('\n', fp);
sprintf(szLine, "Gold: %d", gold);
fputs(szLine, fp); // Сохраняем в файл "Gold: 75".
////////////////////// FPRINTF() ////////////////////////
/* Также, как и printf(), fprintf() работает точно так же. Вместо того, чтобы печатать на экран,
функция печатает в файл. В качестве первого параметра нужно задать указатель на файл. */
fprintf(fp, "\n\n");
// Так мы сдвинем указатель в файле на 2 строки вниз.
fprintf(fp, "Player: %s\n", szName); // Сохраняем имя игрока в файл.
fprintf(fp, "Health: %d\n", health); // Сохраняем здоровье игрока в файл.
fprintf(fp, "Gold: %d\n", gold); // Сохраняем золото игрока в файл.
fclose(fp);
// fclose() закрывает файл (очень важно).
// Всегда следует закрывать файл после работы с ним.
// Это освобождает память и открывает доступ к файлу.
} // Конец программы
//////////////////////////// Примечание //////////////////////////
/* Теперь вы знаете, как записывать данные в файл, и какой же
способ наиболее простой? Скорее всего вы захотите использовать
fprintf(). Хотя я никогда не использовал первые два способа, я
полагаю, что необходимо дать различные примеры.
Конечно, вы не захотите усложнять программу. Скорее всего вы будете
запрашивать ввод имени игрока в начале, сохранять его, и начинать с
определенным количеством здоровья и золота. Теперь, когда вы знаете,
как читать данные и сохранять их в файл, вы сможете создавать файл
сохранения игры. Когда данные записаны, их просто читать. Я рекомендую
использовать fprintf() для записи данных и fscanf() для их чтения.
*/
// © 2001 GameTutorials
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
|