トップ
新規
一覧
単語検索
最終更新
ヘルプ
ログイン
アールメカブ
hidden_malloc
をテンプレートにして作成
開始行:
[[Programming]]
[[ここ:http://sometime.minidns.net/~ccgi/linebbs/getlog.h...
ファイルからの読み込み処理
ログファイルの読み込み処理について解説します。
fgets()でファイルを読み込む
C言語のファイル入出力には高水準(バッファリング付き)のも...
ファイル入出力の一般的な流れは次のようになります。
1. ファイルを適切なモードでオープンする(fopen())
2. 入力や出力などの処理をする(fgets(),fputs()など)
3. ファイルをクローズする
基本的な作法として、入出力の前にファイルをオープンし、処...
ファイルポインタの宣言は次のように行います。
FILE* fp;
これはFILE構造体型のサイズ単位で値が変化するポインタ(変...
読み込みたいファイルの名前をlog.datとすると、読み込むプロ...
#include <stdio.h>
#define LINE_BUF 1024
int main(void)
{
char buf[LINE_BUF];
FILE* log_fp = fopen("log.dat","r");
while(fgets(buf,sizeof buf,log_fp) != NULL) printf("%...
fclose(log_fp);
return 0;
}
ちょっとwhile()の行がごちゃごちゃしていますが、C言語をひ...
まず、main()関数の最初でchar型の配列を宣言しています。こ...
ここで、fgets()関数の仕様を紹介しておきます。
fgets() char* fgets(char* buf,int n,FILE* stream)
標準ライブラリ関数/stdio.h
引数
1. 読み込み用バッファbuf
2. 最大読み込みサイズn
3. 入力ストリームstream
機能 入力ストリームstreamから、読み込み用バッファbufに改...
返却値 bufの先頭へのポインタを返す。ファイルの終わりに達...
注意 改行文字が現れた場合、改行文字までを読み込んで読み込...
注意事項ですが、ストリームからの読み込みを行う場合には必...
fgets()は第1引数に読み込んだ文字列を格納するバッファを指...
メモリに蓄える
2次元配列ではどうか
さて、最初のプログラムでログファイルから1行ずつ読み込んで...
C言語では、データをメモリに蓄えるためには、必ずそのための...
読み込んだログを蓄えておくための領域を確保するための、最...
char log[1000][2048];
のように2次元配列を宣言すると、2048バイトのバッファが1000...
これはこれで間違いではないのですが、見るからにメモリの利...
ここで、fgets()の仕様を思い出してみましょう。fgets()が実...
1行のデータは文字列の長さを調べて動的にそのサイズのメモリ...
1. ポインタ配列にする
2. リスト構造にする
この場合どちらでも良いのですが、これから作ろうとしている...
ポインタ配列を用いてメモリを動的に確保
ログの文字列を保存するためにポインタ配列を使用すると書き...
#define LOG_ARRAY 1000
char* log[LOG_ARRAY];
#defineで定義した定数LOG_ARRAYは扱える最大のログの行数で...
では、ポインタ1個で1行の文字列を扱うためにはどうすればい...
回りくどい表現になったので具体的かつ簡単にいうと、malloc(...
#include <stdio.h>
#define LINE_BUF 1024
#define LOG_ARRAY 1000
int main(void)
{
char buf[LINE_BUF];
char* logline;
FILE* log_fp = fopen("log.dat","r");
fgets(buf,sizeof buf,log_fp);
logline = (char*)malloc(strlen(buf) +1);
strcpy(logline,buf);
printf("%s\n",logline);
free(logline);
fclose(log_fp);
return 0;
}
説明のためできるだけ簡単になるように、ログファイルを1行の...
logline = (char*)malloc(strlen(buf) +1);
実は、ここで注目すべきはこの行のみです。malloc()関数でメ...
1. 左辺のポインタが対応する型と同じ型にキャストしてい...
2. strlen(buf)として、fgets()で取り込んだ文字列の長さ...
3. 上で調べた文字列の長さに1を足し、それを確保する領域...
malloc()のキャストは必要?
malloc()関数はvoid型ですが値を返すという少し変わったとこ...
sizeof(char)は掛けない?
malloc()関数でメモリを確保する場合に、一般にはsizeof(型)...
malloc()でも常に在れ、'\0'
3番目はつい忘れてしまいやすいのですが、文字列を扱う上では...
次のプログラムは、一度ログを全部読み込んでから1行ずつ表示...
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LINE_BUF 1024
#define LOG_ARRAY 1000
int main(void)
{
char buf[LINE_BUF];
char* log[LOG_ARRAY];
int line,printline;
FILE* log_fp = fopen("log.dat","r");
puts("これから読み込み\n");
for(line=0; fgets(buf,sizeof buf,log_fp)!=NULL; line+...
log[line] = (char*)malloc(strlen(buf) +1);
strcpy(log[line],buf);
}
puts("これから表示\n");
for(printline=0; printline<line; printline++){
printf("%s\n",log[printline]);
free(log[printline]);
}
fclose(log_fp);
return 0;
}
logという名のポインタ配列の各要素が、ログの各行の文字列の...
また、この場合はログファイルのすべての行を読み出す処理に...
ところで、このプログラムではmalloc()でメモリを確保したと...
ログファイル読み込みの関数化
ログを読み込む処理を関数にまとめてしまうことを考えてみま...
さて、ここからが重要な話です。ログを読み込む関数は、読み...
ログを読み込む関数
ログを読み込む関数として、次のようなものを作ってみました。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LOG_ARRAY 1000
const char* LogFile = "log.dat";
int readlog(char*** logarray,int read)
{
int line;
char buffer[2560];
FILE *log_fp=fopen(LogFile,"r");
if(read == 0 || read > LOG_ARRAY) read = LOG_ARRAY;
*logarray = (char**)malloc(read * sizeof(char*)); /* ...
for(line=0 ; fgets(buffer,sizeof buffer,log_fp)!=NULL...
(*logarray)[line] = (char*)malloc(strlen(buffer)+...
if((*logarray)[line] == NULL){
fclose(log_fp);
return 0;
}
strcpy((*logarray)[line],buffer);
}
fclose(log_fp);
return line;
}
引数
この関数は2個の引数を取ります。まずは普通のint型の変数で...
問題は1番目の引数char*** logarrayです。見てのとおりの多重...
char***の理由
ポインタ配列を動的に確保するためには、ポインタのポインタ...
これは関数の中でmalloc()によりポインタ配列を確保するため...
int main(void)
{
char** line;
int i,read;
printf("%p\n",line);
read = readlog(&line,0);
printf("%p\n",line);
for(i=0;i<read;i++) printf("%s\n",line[i]);
printf("%d\n",read);
for(i=0;i<read;i++) free(line[i]);
free(line);
return 0;
}
終了行:
[[Programming]]
[[ここ:http://sometime.minidns.net/~ccgi/linebbs/getlog.h...
ファイルからの読み込み処理
ログファイルの読み込み処理について解説します。
fgets()でファイルを読み込む
C言語のファイル入出力には高水準(バッファリング付き)のも...
ファイル入出力の一般的な流れは次のようになります。
1. ファイルを適切なモードでオープンする(fopen())
2. 入力や出力などの処理をする(fgets(),fputs()など)
3. ファイルをクローズする
基本的な作法として、入出力の前にファイルをオープンし、処...
ファイルポインタの宣言は次のように行います。
FILE* fp;
これはFILE構造体型のサイズ単位で値が変化するポインタ(変...
読み込みたいファイルの名前をlog.datとすると、読み込むプロ...
#include <stdio.h>
#define LINE_BUF 1024
int main(void)
{
char buf[LINE_BUF];
FILE* log_fp = fopen("log.dat","r");
while(fgets(buf,sizeof buf,log_fp) != NULL) printf("%...
fclose(log_fp);
return 0;
}
ちょっとwhile()の行がごちゃごちゃしていますが、C言語をひ...
まず、main()関数の最初でchar型の配列を宣言しています。こ...
ここで、fgets()関数の仕様を紹介しておきます。
fgets() char* fgets(char* buf,int n,FILE* stream)
標準ライブラリ関数/stdio.h
引数
1. 読み込み用バッファbuf
2. 最大読み込みサイズn
3. 入力ストリームstream
機能 入力ストリームstreamから、読み込み用バッファbufに改...
返却値 bufの先頭へのポインタを返す。ファイルの終わりに達...
注意 改行文字が現れた場合、改行文字までを読み込んで読み込...
注意事項ですが、ストリームからの読み込みを行う場合には必...
fgets()は第1引数に読み込んだ文字列を格納するバッファを指...
メモリに蓄える
2次元配列ではどうか
さて、最初のプログラムでログファイルから1行ずつ読み込んで...
C言語では、データをメモリに蓄えるためには、必ずそのための...
読み込んだログを蓄えておくための領域を確保するための、最...
char log[1000][2048];
のように2次元配列を宣言すると、2048バイトのバッファが1000...
これはこれで間違いではないのですが、見るからにメモリの利...
ここで、fgets()の仕様を思い出してみましょう。fgets()が実...
1行のデータは文字列の長さを調べて動的にそのサイズのメモリ...
1. ポインタ配列にする
2. リスト構造にする
この場合どちらでも良いのですが、これから作ろうとしている...
ポインタ配列を用いてメモリを動的に確保
ログの文字列を保存するためにポインタ配列を使用すると書き...
#define LOG_ARRAY 1000
char* log[LOG_ARRAY];
#defineで定義した定数LOG_ARRAYは扱える最大のログの行数で...
では、ポインタ1個で1行の文字列を扱うためにはどうすればい...
回りくどい表現になったので具体的かつ簡単にいうと、malloc(...
#include <stdio.h>
#define LINE_BUF 1024
#define LOG_ARRAY 1000
int main(void)
{
char buf[LINE_BUF];
char* logline;
FILE* log_fp = fopen("log.dat","r");
fgets(buf,sizeof buf,log_fp);
logline = (char*)malloc(strlen(buf) +1);
strcpy(logline,buf);
printf("%s\n",logline);
free(logline);
fclose(log_fp);
return 0;
}
説明のためできるだけ簡単になるように、ログファイルを1行の...
logline = (char*)malloc(strlen(buf) +1);
実は、ここで注目すべきはこの行のみです。malloc()関数でメ...
1. 左辺のポインタが対応する型と同じ型にキャストしてい...
2. strlen(buf)として、fgets()で取り込んだ文字列の長さ...
3. 上で調べた文字列の長さに1を足し、それを確保する領域...
malloc()のキャストは必要?
malloc()関数はvoid型ですが値を返すという少し変わったとこ...
sizeof(char)は掛けない?
malloc()関数でメモリを確保する場合に、一般にはsizeof(型)...
malloc()でも常に在れ、'\0'
3番目はつい忘れてしまいやすいのですが、文字列を扱う上では...
次のプログラムは、一度ログを全部読み込んでから1行ずつ表示...
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LINE_BUF 1024
#define LOG_ARRAY 1000
int main(void)
{
char buf[LINE_BUF];
char* log[LOG_ARRAY];
int line,printline;
FILE* log_fp = fopen("log.dat","r");
puts("これから読み込み\n");
for(line=0; fgets(buf,sizeof buf,log_fp)!=NULL; line+...
log[line] = (char*)malloc(strlen(buf) +1);
strcpy(log[line],buf);
}
puts("これから表示\n");
for(printline=0; printline<line; printline++){
printf("%s\n",log[printline]);
free(log[printline]);
}
fclose(log_fp);
return 0;
}
logという名のポインタ配列の各要素が、ログの各行の文字列の...
また、この場合はログファイルのすべての行を読み出す処理に...
ところで、このプログラムではmalloc()でメモリを確保したと...
ログファイル読み込みの関数化
ログを読み込む処理を関数にまとめてしまうことを考えてみま...
さて、ここからが重要な話です。ログを読み込む関数は、読み...
ログを読み込む関数
ログを読み込む関数として、次のようなものを作ってみました。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LOG_ARRAY 1000
const char* LogFile = "log.dat";
int readlog(char*** logarray,int read)
{
int line;
char buffer[2560];
FILE *log_fp=fopen(LogFile,"r");
if(read == 0 || read > LOG_ARRAY) read = LOG_ARRAY;
*logarray = (char**)malloc(read * sizeof(char*)); /* ...
for(line=0 ; fgets(buffer,sizeof buffer,log_fp)!=NULL...
(*logarray)[line] = (char*)malloc(strlen(buffer)+...
if((*logarray)[line] == NULL){
fclose(log_fp);
return 0;
}
strcpy((*logarray)[line],buffer);
}
fclose(log_fp);
return line;
}
引数
この関数は2個の引数を取ります。まずは普通のint型の変数で...
問題は1番目の引数char*** logarrayです。見てのとおりの多重...
char***の理由
ポインタ配列を動的に確保するためには、ポインタのポインタ...
これは関数の中でmalloc()によりポインタ配列を確保するため...
int main(void)
{
char** line;
int i,read;
printf("%p\n",line);
read = readlog(&line,0);
printf("%p\n",line);
for(i=0;i<read;i++) printf("%s\n",line[i]);
printf("%d\n",read);
for(i=0;i<read;i++) free(line[i]);
free(line);
return 0;
}
ページ名: