まさ1941 さんが書きました:
コード:
char buf[11] = {""}; // 読み取り時の一時保存用
char str[110] = {""}; // 読み取った文字列の保存用
>> バグ様
自分は、char 型の初期値を {""} としました。
No: 9 の1つ目のプラグラムの方で、char 型の変数の初期値を {0, } とされていますが、
こうすべきなのか、こうした方がいいのか、また、自分のものでは問題があるか、教えていただきたいです。
問題はなく結果は同じですが若干意味が違います。
まずバグさんの{0, }は,以降の要素がないので{0}と解釈されchar型配列の先頭の要素を0、それ以降を初期値(0)で初期化します。
ですので、{5, 3}と書けば[5, 3, 0, ...]の様になります。また、{0}の{}を外して0とするとエラーになります。
コード:
char buf[11] = {0}; // OK
char buf[11] = {0, }; // OK
char buf[11] = {5, 3}; // OK
char buf[11] = 0; // Error
一方{""}はchar型配列の先頭の要素を""で初期化するのではなく、{}が取れて解釈されchar buf[11] = "";と同じ意味になります。
また、{""}はバグさんのような書き方をするとエラーになります。(""を先頭の要素として配列を初期化するという意味にはならないので)
コード:
char buf[11] = {""}; // OK
char buf[11] = {"", }; // Error
char buf[11] = {"", 3}; // Error
char buf[11] = ""; // OK
また、'\0'(ヌル文字)を用いて次のように書くことも出来ます。
コード:
char buf[11] = {'\0'};
まさ1941 さんが書きました:
コード:
char buf[11] = {""}; // 読み取り時の一時保存用
while(fgets(buf, 10, fp1) != NULL){ // 1 行ずつ str に結合していく
strcat(str, (const char*)buf);
}
>> non 様
このプログラムでは、対象となるファイルの1行は 10 文字('\n' 含む)が最大とし、文字列の末尾の '\0' を入れて、変数 buf の大きさは「11」としました。
また、テキストの行は最大 10 行 とし、変数 str の大きさは「110」としました。
fgetsは(第二引数-1)バイト分読み込みますので10を指定した場合は9バイト読み込みます。('\0'除く)
ですので、ここはfgets(buf, 11, fp1)と書いても構いません。
http://ja.wikipedia.org/wiki/Fgets
http://ohmoriws1.ms.kagu.tus.ac.jp/1997 ... i/c04.html
オフトピック
連結すると'\0'は末尾だけに付与されるのでstrの大きさは101でも問題ないですが・・・
ちなみに、僕ならこんな感じにします。
コード:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_LINE 100 // 最大100行
int main()
{
char **str_lines;
char *file_name = "test.txt";
FILE *fp = fopen(file_name, "r");
int file_length;
int line_count = 0;
int len;
int i;
if (fp == NULL)
{
printf("file cannot open: %s\n", file_name);
return -1;
}
// ファイルの総バイト数を調べる
fseek(fp, 0, SEEK_END);
file_length = ftell(fp);
fseek(fp, 0, SEEK_SET);
// ファイルが空ならエラー
if (file_length == 0)
{
printf("file is empty: %s\n", file_name);
return -2;
}
// MAX_LINE × file_lengthで確保する
str_lines = (char**)calloc(MAX_LINE, sizeof(char*));
for (i = 0; i < MAX_LINE; i++)
{
str_lines[i] = (char*)calloc(file_length + 1, sizeof(char)); // ヌル文字を考慮して+1
}
// 最大MAX_LINE行読み込む
while (line_count < MAX_LINE && fgets(str_lines[line_count], file_length + 1, fp) != NULL)
{
len = strlen(str_lines[line_count]);
if (str_lines[line_count][len - 1] == '\n') // 末尾の'\n'を除去
{
str_lines[line_count][len - 1] = '\0';
}
line_count++;
}
// 読み込んだ分を出力してみる
for (i = 0; i < line_count; i++)
{
printf("%d : %s\n", i + 1, str_lines[i]);
}
// ちゃんと解放
for (i = 0; i < MAX_LINE; i++)
{
free(str_lines[i]);
}
free(str_lines);
fclose(fp);
return 0;
}
main関数縛りのようなのでそれに準じましたがここまで来ると関数化したくなりますねw