アプリ版:「スタンプのみでお礼する」機能のリリースについて

ファイルから全文読み込むにはどのようにしたらよいのでしょう?

・1行あたり最大100文字まで
・何行あるか不明
・すべて半角英数字
・途中に半角スペースあり

全文読み出し、配列に取っておきたいと思いますが、
具体的にどうしたらよいのかわかりません。
fgetsですと最後の1行しか取れませんし・・

A 回答 (5件)

改行を\0に置き換えながらその次のアドレスをchar*に入れていく


これは
char** line = malloc(sizeof(char*) * line_count);
line[0] = strtok( buf, "\n" );
for (i = 1; i < line_count; i++) {
line[i] = strtok( NULL, "\n" );
}
でできそうですね
bufはファイル全部を読み込んだポインタでline_countはbufをサーチして数えた行数(\nの数)です。
bufの最後には0が必要ですのでメモリ確保時に1バイト余分に確保して最後に0を代入すればいいでしょう。
    • good
    • 0

ファイルからfgetsで1行ずつ読みながらリストに追加していく方法がシンプルではないでしょうか。


こんな感じ?(サンプルですので動作保証しません)
/* ファイルから読んだ文字列をリストに入れる */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct node {
 struct node* next; /* 次のデータへのポインタ */
 char *record; /* データ内容 */
};
/* リストの最後にデータを付加する */
void addlist(struct node *p, char *s) {
 struct node *pp;
 while (p->next != NULL) p=p->next; /* 最後のノードを探す */
 pp=(struct node*)malloc(sizeof(struct node)); /* 新しいノード */
 if (pp==NULL) {
  printf("pp malloc error\n"); return;
 }
 pp->record=(char*)malloc(strlen(s)+1); /* 新しいデータ */
 if (pp->record==NULL) {
  printf("record malloc error\n"); return;
 }
 strcpy(pp->record, s); /* データの内容をコピー */
 pp->next=p->next; p->next=pp; /* リストに挿入 */
}
/* リストの内容を表示 */
void printlist(struct node *p) {
 while ((p=p->next)!=NULL) {
  printf("%s",p->record);
 }
}
/* リストを全部消す */
void rmlist(struct node *p) {
 struct node *pp=p->next;
 p->next=NULL; /* rootはmallocしてないのでfreeしないでNULL入れる */
 while (pp!=NULL) {
  p=pp;
  pp=pp->next;
  free(p->record); free(p); /* mallocした領域を開放 */
 }
}

int main(int argc, char **argv) {
 struct node root={NULL,""};
 FILE *fp;
 char buf[256];
 /* コマンドラインからファイル名取得して開く */
 if (argc!=2) return -1;
 if ((fp=fopen(argv[1],"r"))==NULL) {
  printf("%s open error\n",argv[1]); return -1;
 }
 /* 全文を読みながらリストに追加 */
 while(fgets(buf, sizeof(buf),fp)!=NULL) {
  addlist(&root,buf);
 }
 /* ファイルを閉じる */
 fclose(fp);
 /* リストを表示 */
 printlist(&root);
 /* リストを消す */
 rmlist(&root);
 
 return 0;
}
    • good
    • 0

こんにちは。



linux系だとfstatでファイルサイズが取れますが環境が解らないので
stdio.h の範囲内で、こんな感じでどうでしょうか?

/* ファイルオープン (fopen) */
/* ファイル最後に移動 (fseek) */
/* ファイルサイズを取得 (ftell) */
/* ファイル先頭に戻す (fseek) */
/* ファイルサイズ分の配列を確保 */
/* ファイル読み込み (fread) */
/* ファイルクローズ (fclose) */

ご参考までに。
    • good
    • 0

>fgetsですと最後の1行しか取れませんし・・


間違い。
ひょっとしたらそんな仕様のコンパイラもあるのかもしれませんが
通常、1バイト目から取りにいきます。
最悪、fseekで強制的に読み取り位置を変えてやればいいかと。

fgetsは指定したバイト数だけ引っ張ってきます。

ひょっとして、リードバッファをずっと同じものを使っているから
ループから抜けたときに最終行を保持してるのではないでしょうか?
    • good
    • 0

ファイルサイズを取得してその分のメモリを確保して全部読み込む


改行の数を数えてその数のchar*を確保
改行を\0に置き換えながらその次のアドレスをchar*に入れていく
とか

この回答への補足

そんなことができそうだな~というのは浮かんではいるのですが、
具体的にどのようにコードを組んだらよいのかを悩んでます。

補足日時:2008/10/14 14:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!