Cで改行まで任意文字数の読み込みをする+改行削除
-- 2014/11/08 20:54
唐突ですが、Cです。
Cにはfgetsとか固定長バッファに一気読みする関数はあるんですが、一般的なアプリケーションに任意長読み込みは欠かせません。
で、任意長読み込みは固定長バッファから任意長バッファにreallocを繰り返してコピれば可能だと思うんですが、そういうサンプルコードがなんかどこにも見当たらなかったんです。
なのでしょうがないから書きました。使ってやってください。
初心者向けページはポインタの説明済んだら固定長なクソコード書かさないようにこういうのを説明してほしい。
ただし当方Cについては素人なのでメモリリークとかしてる可能性が多分にあります。ぜひぜひバグ指摘歓迎。コメントにどうぞ。
ライセンスはNYSL/CC0/パブリックドメインのトリプルライセンスです(ぉ
Cにはfgetsとか固定長バッファに一気読みする関数はあるんですが、一般的なアプリケーションに任意長読み込みは欠かせません。
で、任意長読み込みは固定長バッファから任意長バッファにreallocを繰り返してコピれば可能だと思うんですが、そういうサンプルコードがなんかどこにも見当たらなかったんです。
なのでしょうがないから書きました。使ってやってください。
初心者向けページはポインタの説明済んだら固定長なクソコード書かさないようにこういうのを説明してほしい。
ただし当方Cについては素人なのでメモリリークとかしてる可能性が多分にあります。ぜひぜひバグ指摘歓迎。コメントにどうぞ。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
/** getline
* 与えられたファイルポインタから、改行までの任意長の文字列を読み込み返します。(size_t上限までだけど)
* fgetsがNULLを返せばそこまでの文字列を返します。メモリ確保に失敗すればNULLを返します。
* 当然ながら返された文字列は適切にfreeしてください。GETLINE_BUF_SIZEは用途に応じて調整してください。
**/
#define GETLINE_BUF_SIZE 100
char* getline(const FILE *fp){
char *buf;
char *line;
char *line_new;
size_t line_len;
size_t line_len_old;
buf = (char*)malloc(sizeof(char) * GETLINE_BUF_SIZE);
line = (char*)malloc(sizeof(char));
*line = '\0';
line_len = 0;
while(true){
if(fgets(buf, GETLINE_BUF_SIZE, stdin) == NULL){
return line;
};
line_len_old = line_len;
line_len += strlen(buf);
line_new = (char*)realloc(line, sizeof(char) * (line_len + 1));
if(line_new == NULL){
free(line);
return NULL;
}
line = line_new;
strcpy(line + line_len_old, buf); /* strcat(line, buf) */
if(strchr(buf, '\n') != NULL){
break;
}
}
free(buf);
return line;
}
/* おまけ */
/** chomp
* 与えられた文字列に末尾の改行があれば削除します。
**/
void chomp(char* line){
char *index;
if((index = strrchr(line, (int)'\n')) != NULL && *(index + 1) == '\0') *index = '\0';
if((index = strrchr(line, (int)'\r')) != NULL && *(index + 1) == '\0') *index = '\0';
}
ライセンスはNYSL/CC0/パブリックドメインのトリプルライセンスです(ぉ
