//main.cppのソースです
#include "main.h"
int main()
{
int i;
ScriptInformation script;
loadScript( "default.txt", &script );
//10行目までを表示
for( i = 0; i < 10; i++ ) {
printf("%d : %s\n", i + 1, script.script[i] ); //疑問1"%s\n"って?
}
}
//main.hのソースです
//////////////////////////////////////
//スクリプトエンジン //
//////////////////////////////////////
#include <stdio.h>
#include <string.h>
#define SCRIPT_MAX_LINE 1000 //スクリプトは最大1000行まで読み込む
#define SCRIPT_MAX_STRING_LENGTH 300 //スクリプト一行の最大文字数
typedef struct ScriptInformation_tag {
int maxLineNumber; //スクリプト行数
int currentLine; //現在何行目を実行しているか
const char* filename; //ファイル名
char script[SCRIPT_MAX_LINE][SCRIPT_MAX_STRING_LENGTH];//メモリ確保3,000,000も確保しており無駄じゃないのか?
} ScriptInformation;
//スクリプトファイルを読み込む
//戻り値 -1 : 失敗 0 : 成功
int loadScript(const char* filename, ScriptInformation* scriptInfo)
{
int pos;
char c;
FILE* fp; //スクリプトファイル
memset( scriptInfo , 0, sizeof(ScriptInformation) ); //スクリプト情報を初期化
fp = fopen(filename, "r"); //スクリプトファイルを開く
if( fp == NULL ) { //ファイル読み込みに失敗
printf("スクリプト %s を読み込めませんでした\n", filename);
return -1;
}
//script書き込み時に使用 //疑問2 書き込み? ”どこに””なにを”書き込むのか
pos = 0;
for( ;; ) {
//一文字読み込み //スクリプトファイルの中を見て、一文字取り出し、feofでなければcに一文字を格納する?
c = fgetc( fp );
//ファイルの終わりかどうか
if( feof( fp ) ) {
break;
}
//ここから下が特に意味分かりませんorz
if( pos >= SCRIPT_MAX_STRING_LENGTH - 1 ) { //疑問3 posが299より大きい場合? この時点ではposは0ではないのか?
printf("error: 文字数が多すぎます (%d行目)", scriptInfo->currentLine ); //1行の文字数が多すぎる
return -1;
}
//改行文字が出てきた場合,次の行へ移動
if( c == '\n' ) {
scriptInfo->script[ scriptInfo->currentLine ][ pos ] = '\0'; //\0を文字列の最後に付ける ←疑問4 なんで0をつける必要があるのか
scriptInfo->currentLine++; //次の行に移動
pos = 0; //書き込み位置を0にする ←疑問5 書き込み位置を0にする理由は?
}else {
scriptInfo->script[ scriptInfo->currentLine ][ pos ] = c; //書き込み //疑問6 この一行の構文の意味がわかりません
pos++; //文字書き込み位置をずらす
}
}
scriptInfo->maxLineNumber = scriptInfo->currentLine; //最大行数
scriptInfo->currentLine = 0; //読み込み中の行を0にする
scriptInfo->filename = filename; //スクリプトファイル名を設定
return 0;
}
あるサイトに掲載されてましたサンプルコードを読もうと思いましたが、サッパリ分かりません ;;
勉強していくうちに、
「スクリプトファイル」を読み込んでメモリ上に「バイナリデータ」として書き出し、その「バイナリデータ」を出力していると思われますが、ソースコードの中で、どの構文が「スクリプトファイルに対する操作」でどの構文が「バイナリデータに対する操作」なのかが分からないです。
疑問4や疑問5のところから、「スクリプトファイルではhelloと書かれている」のを、「バッファに0と1だけのバイナリデータを構築している」のかな?と思ってますが・・・
(でないと0を書き込む理由が分からないので・・・ もしくはmemset関数で一度全てのバッファ領域を0で埋めたことが関係している?)
また疑問1や疑問6のようにちょっと変わった書き方があり、解読できません。 特に疑問6の”構造体型ポインタ ->構造体内のメンバ[][]”という構文は似たような構文すら見当たらず、構造体やポインタに慣れてない私には目玉が飛びぬけるほどのコードです。
特にメモリ上の動きがまったく分からないので紙に書いてみたりしましたがサッパリです(コードのどのあたりで、メモリ上ではどうなっているのかetc)
長いコードでありながら最後まで読んでいただき、ありがとうございました