私は最初、設定ファイルへの/からの書き込みが遅いと思っていました.dbへの/からの書き込みについても同様の考えがありました。いくつかの良い提案が提供されました: sqlite と構成ファイル パーサーですが、最終的には、昔ながらの方法でテキスト ファイルとの間で数行の書き込み/読み取りを行うことはそれほどコストがかからないと判断しました。
これらの概念をエディタに組み込む前に、デモ プログラムを作成しました。これを以下に示します。特にメモリ使用量に関して、このプログラムを自由に批判してください。このプログラムは、次の手順を示しています。
(リストを作成すると、コードブロックが台無しになるようです)
1) 構成ファイルが存在するかどうかを確認します。2) 存在する場合は構成ファイルを削除します。3) 構成ファイルへのパスを書き込みます。4) 構成ファイルからパスを読み取ります。
/*
* Compile Command:
* gcc ledit_config.c -o ledit_config
*
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // system
#define NUM_TABS 10
char paths[NUM_TABS][200];
void write_config();
void read_config();
int main ()
{
write_config();
read_config();
}
void write_config()
{
char *config_file;
char temp[200];
int i=0;
/* change to the user's home directory (for fopen) */
(int)chdir(getenv("HOME"));
config_file = ".config/ledit/files";
/* populate paths array with random paths */
strcpy(paths[0], "~/Documents/code/glade/tutorial1/scratch_files/scratch.py");
strcpy(paths[4], "~/Documents/code/glade/tutorial1/scratch_files/scratch.c");
strcpy(paths[7], "~/Documents/code/glade/tutorial1/scratch_files/scratch.glade");
if (fopen(config_file, "r") == NULL) /* file does not exist */
{
system("mkdir -p $HOME/.config/ledit/");
FILE *fp;
fp=fopen(config_file, "w");
for(i = 0;i < NUM_TABS;++i)
{
strcpy(temp,paths[i]);
strcat(temp, "\n");
if (strlen(temp) > strlen("\n")) /* check to see if element actually contains more than just "\n" */
{
fprintf(fp, "%s",temp);
}
}
fclose(fp);
}
else /* file does exist */
{
system("rm $HOME/.config/ledit/files");
FILE *fp;
fp=fopen(config_file, "w");
for(i = 0;i < NUM_TABS;++i)
{
strcpy(temp,paths[i]);
strcat(temp, "\n");
if (strlen(temp) > strlen("\n")) /* check to see if element actually contains more than just "\n" */
{
fprintf(fp, "%s",temp);
}
}
fclose(fp);
}
}
void read_config()
{
char line[200];
char *config_file;
int i=0;
/* change to the user's home directory (for fopen) */
(int)chdir(getenv("HOME"));
config_file = ".config/ledit/files";
/* empty the paths array */
for(i = 0;i < NUM_TABS;++i)
strcpy(paths[i], "");
/* read the config file and poplulate array */
i = 0;
FILE* fp = fopen(config_file,"r");
while(fgets(line,sizeof(line),fp) != NULL)
{
strcpy(paths[i], line);
i++;
}
fclose(fp);
/* print out paths array for verification */
for(i = 0;i < NUM_TABS;++i)
printf("%s",paths[i]);
}