歯ブラシ選びの大事なポイントとは?

こんにちは。
回答お願いします。
今私は作業の高効率化を目指すためプログラムを考えています。
まだぜんぜんできていませんが・・
ファイルの指定された行を表示する関数がないだろうか?
もしくは似たような方法はないだろうかと考えています。

できれば例題とともに教えていただければ幸いです。
具体的にどういう風にしたいのかというと
----test.txt-------
aaaa
bbbbb
cccccc
dddd
eeeeeeee
ffffff
-------------------
というファイルがあったとしたらgetsで4と入れてやったら
四行目のddddが表示されるようにしたいのです。
まだまだ初心者ですのでさっと考えることができません。
どうかご教授お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

★高効率を目指しているの?


・固定長データなら高効率で1行を取得できたりします。
 例えば
 ----test.txt-------
 aaaaa
 bbbbb
 ccccc
 ddddd
 eeeee
 fffff
 -------------------
 という固定長データ(5文字×6行)の場合は
 int no = 4; ←4行目を取得したい時
 fseek( fp, ((no - 1) * 7), SEEK_SET ); ←5文字+\r+\n=『7』
 fgets( buff, sizeof(buff), fp );
 ↑
 これなら行番号で指定した1行を fgets() 関数で取得可能です。
 ※なおバイナリモードでオープンして下さい。
・可変長データの場合は行の先頭のオフセット位置を最初の読み込みで管理します。
 例えば
 ----test.txt-------
 aaaa
 bbbbb
 cccccc
 dddd
 eeeeeeee
 ffffff
 -------------------
 という可変長データ(4,5,6,4,8,6文字)の場合は
 オフセット位置の配列を行数分用意します。→事前に分かれば楽ですね。行数。
 long offset[ 100 ]; ←100行だと仮定
 int max;
 
 for ( max = 0 ; !feof(fp) ; max++ ){
  if ( max >= 100 ){ ←安全対策
   break;
  }
  offset[ max ] = ftell( fp );
  fgets( buff, sizeof(buff), fp );
 }
 ↑
 ここまでがオフセット位置の読み込みです。次は読み出しです。
 int no = 4; ←4行目を取得したい時
 fseek( fp, offset[no - 1], SEEK_SET );
 fgets( buff, sizeof(buff), fp );
 ↑
 これで行番号で指定した1行を fgets() 関数で取得可能です。
 ※やっぱりバイナリモードでオープンして下さい。
・あと行数の指定時に 1~max の範囲になるように補正処理も入れたほうが良いかも。
 例えば
 if ( no < 1 ){
  no = 1;
 }
 else if ( no >= max ){
  no = max;
 }
 ↑
 こんな感じで。
・以上を参考にして下さい。
 下の『参考URL』もどうぞ。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/fseek.html
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
よくわかりました。
行数が不明な場合
while(fgets(buff, STRING_MAX, filep) != NULL){ /* 1行読み込み */
count++; /* 行数カウント */
}
見たいな感じでカウントしてやって
long offset[ count ];
って感じで宣言できませんかね・・
手元にコンパイラ入ったPCがないもので・・
今日戻ったら試してみようと思います。

お礼日時:2007/07/11 07:41

★回答者 No.1 です。

行数を最初に数えるの?
>行数が不明な場合
 ↑
 最初に行数を数えると巨大な(行数が多い)ファイルだと初期化に時間がかかります。
 でも一度、読み込んでしまえば後は行数指定で行を取得できますね。
>long offset[ count ];
>って感じで宣言できませんかね・・
 ↑
 C99 に対応していれば可能です。
 既に回答者 No.2 さんのアドバイスにあるとおりです。

余談:
・この質問はどんな処理に利用するのでしょうか?
 昔、MS-DOS 時代の時にページャソフト(テキスト・ビューワ)を作ったときに同じ考えで
 行の先頭オフセット位置を管理して表示、ジャンプさせました。
 あの時代はメモリが少なく、また実行時のメモリを抑えるためにスモールモデルや
 タイニーモデルで作りました。
・タイニーモデルでは全体で 64KB に制限されるためオフセット位置のメモリ(配列)を
 工夫しました。具体的には 100行単位でのオフセットを記憶・管理します。
 その後 123 行から表示をする場合は 100行目の位置へ移動してそこから 199行までの
 行の先頭オフセット位置を読み込みます。そして 123 行からの表示をさせました。
・こんな工夫のお陰か巨大な(行数の多い)ファイルでも一度オフセット位置を読み込めば
 任意の位置からジャンプして表示するのにあまり時間がかかりませんでした。
 でも決して高速表示ではありませんよ。
 メモリを節約して行数の多いファイルも閲覧出来ることを目的としていますので。
 最大 100,000 行まで覗けました。100行単位に分割しているのがミソです。

動的確保:
・C99 に対応していないと動的確保になりますが、このときに行とオフセット位置の
 読み込みを同時にした方が良いでしょう。もちろん最初に行数を単純にカウントしてから
 動的に確保しても良いですが。その方が簡単ですしね。
・でも同時にする場合は1024行単位でオフセット位置配列をリスト構造で用意します。
 つまり、
 typedef struct offset_t {
  long offset[ 1024 ];
  struct offset_t *next;
 } offset_t;
 という構造体を用意して
 static struct {
  struct offset_t *head; // 単方向リストの先頭
  struct offset_t *tail; // 単方向リストの最後
  struct offset_t **table; // 1024行単位の配列(これが参照用テーブル)
  int maxBlock; // 確保したブロック数
  int maxCount; // 読み込んだ最大行数
 } sys;
 という構造体で管理します。
・上記の構造体を使って最初 1024 行まで読み込みます。同時にオフセット位置もセット。
 そして 1024 行を超える場合は新しく struct offset_t 構造体を動的確保して鎖のように
 つなげていきます。これをファイルの最後まで 1024 行単位で繰り返します。
・すべてオフセット位置を読み込んだ後は maxCount / 1024 のブロック数のポインタ配列を
 動的に確保します。→struct offset_t 型の配列
 確保したらそのポインタ配列 table[0]~table[maxBlock - 1] に単方向リストの先頭 head
 から順に struct offset_t 型のポインタをセットしていきます。
 これで
 table[0]…0~1023行のオフセット
 table[1]…1024~2047行のオフセット
 table[2]…2048~3071行のオフセット
  :
 という感じになります。
 ※maxBlock は (maxCount / 1024) + !!(maxCount % 1024) という数です。
 ※maxBlock は (maxCount >> 10) + !!(maxCount & 0x3FF) と計算しても良い。
・指定行のジャンプ・取得では
 int no = 12345; ←12345行目を取得したい時
 no--; ←行数を 0~??? にするためデクリメント
 fseek( fp, sys.table[no >> 10].offset[no & 0x3FF], SEEK_SET );
 fgets( buff, sizeof(buff), fp );
 という感じで取得できます。
 ※1024 行単位にしている理由はビットシフト、ビットAND でアクセスするためです。
・あと一度 table を確保したらそのポインタ配列(ブロック数)を maxBlock で管理して
 別ファイルを再読み込みする場合に maxBlock 以下ならそのまま、maxBlock 以上になったら
 拡張するため table を realloc または free/malloc して下さい。
 その他、C++ の Vector などで管理するのも良い。C 言語ならリストで実装するなど工夫。
・以上。参考に。
    • good
    • 0
この回答へのお礼

大変わかりやすく記述されてありがとうございます。
私にはちょっと難しい感じもしますがチャレンジしてみます。

お礼日時:2007/07/12 16:05

>long offset[ count ];


gccかC99規格の標準コンパイラなら可能です。
それ以外の環境でするなら、動的なメモリ確保を行うことになります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
2003.netは対応してなかったみたいです。。

お礼日時:2007/07/12 16:03

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイルの特定行の抽出

C++言語についての質問です。

C++を利用して下記の処理を考えています。

下記のようなテキストファイルから、「名前」で始まる行だけを
抽出して、別のテキストファイへ書き込みを行います。
また、その際に”「名前」の表記”+”スペース文字”は削除します。

-----------------
住所 東京都
名前 AAAAA
年齢 15才
-----------------
住所 神奈川県
名前 BBBBB
年齢 20才
-----------------
<略>

実行後に出力されるテキストファイルには、

AAAAA
BBBBB

と記載されるように処理を行いたいです。

初心者のため、実現可能かも分かっていません・・。
お手数ですが、アドバイスをお願いします。

具体的な方法についても記載して頂けると助かります。

よろしくお願いします。

Aベストアンサー

No4です(改修←早っ、おちつけ年寄り)。
>また、その際に”「名前」の表記”+”スペース文字”は削除します。

スペース文字として、「半角または全角の1つ」としました。

while( NULL != fgets( cBuf, 255, fp1 ) ){

if( strstr( cBuf, "名前 " ) ) fprintf( fp2, "%s", &cBuf[5] );
if( strstr( cBuf, "名前 " ) ) fprintf( fp2, "%s", &cBuf[6] );
}
こんなのじゃあ質問しないか簡単すぎて・・・。C++に書き換えろ、ということかなぁ(ご質問主旨に沿っていないのではと不安)。
No1回答者さんがいわれるように「がんばって」なくて申し訳ない。

Qファイルから読みこむ方法

Unix C++でファイルから、特定の行を読みこむことは可能でしょうか。
例えば、5行目から最後の行まで。10行目から20行目。等。

Aベストアンサー

 CやC++には、テキストファイルから指定した行を読み込むという関数は用意されていません。
 ですので、ファイル先頭から行単位で読んでいき、読んでいる行数を変数でカウントしながら、目的の行だけ配列に入れるなどの処理を行うことになります。

 行単位の読み込みは、istream系オブジェクトに用意されたgetlineメソッドで行えばよいでしょう。

#include <iostream.h>
#include <fstream.h>

int main(void)
{
  ifstream fin;
  int s = 10;   // 先頭からなら 1 を指定する
  int e = 20;   // 末尾までなら -1 を指定する
  const int bufsize = 256;
  char buf[bufsize];

  fin.open("xxx", ios::in | ios::nocreate);
  if (fin.fail()) {
    cerr << "ファイルを開けません\n";
    return 1;
  }
  for (int i = 1; i < s; i++)   // 読み飛ばし
    fin.getline(buf, bufsize);
  for (int i = s; i<=e || (e==-1 && !fin.eof()); i++) {
    fin.getline(buf, bufsize);
    cout << buf << endl;
  }
  fin.close();

  return 0;
}

 ところで、これまでの回答には何の補足もお礼もありませんが、解決はしたのですか?未解決なら分からないところを書かないと、新しい回答は書きにくいものですよ。

 CやC++には、テキストファイルから指定した行を読み込むという関数は用意されていません。
 ですので、ファイル先頭から行単位で読んでいき、読んでいる行数を変数でカウントしながら、目的の行だけ配列に入れるなどの処理を行うことになります。

 行単位の読み込みは、istream系オブジェクトに用意されたgetlineメソッドで行えばよいでしょう。

#include <iostream.h>
#include <fstream.h>

int main(void)
{
  ifstream fin;
  int s = 10;   // 先頭からなら 1 を指定する
...続きを読む

QC言語で複数列のデータを1列のみ読み込みたい

行m列の任意のデータの処理を行うプログラムで,
列ごとの統計を行うためにm列目のデータを取り出したいのですが,うまくいきません.
どのようなコードを書けばいいでしょうか?

自分で作ってみたのは以下のようなプログラムです(ファイルを開いて→m列目の読み込みの部分)
EOFを使っているためか,行数のiには全データ数が入ってしまいます.


void main (void)
{
FILE* fp;

int i, j;
i=0, j=0;

char FilePath[500];
char Folder[100];
char File[50];

printf("Folder Name:");
scanf("%s",&Folder);

printf("File Name:");
scanf("%s",&File);

sprintf(FilePath,"%s/%s",Folder,File);

if(( fp = fopen (FilePath,"r")) == NULL){
printf("cannot open '%s'\n", FilePath);
exit(1);
} //ここまではうまく動きます


while (fscanf(fp, "%lf", &A[i][0]) != EOF{
i++;
}
while (fscanf(fp, "%lf", &A[0][j]) != EOF){
j++;
}

printf("A[%d][%d]", i, j);
int n, m;              //n,mはこの後for文で使いたいので登場してもらいました
printf("input 'n':");
scanf("%d", &n);
printf("input 'm':");
scanf("%d", &m);

行m列の任意のデータの処理を行うプログラムで,
列ごとの統計を行うためにm列目のデータを取り出したいのですが,うまくいきません.
どのようなコードを書けばいいでしょうか?

自分で作ってみたのは以下のようなプログラムです(ファイルを開いて→m列目の読み込みの部分)
EOFを使っているためか,行数のiには全データ数が入ってしまいます.


void main (void)
{
FILE* fp;

int i, j;
i=0, j=0;

char FilePath[500];
char Folder[100];
char File[50];

printf("Folder Name:");
scanf("%s",&...続きを読む

Aベストアンサー

>どのようなコードを書けばいいでしょうか?

 http://okwave.jp/qa/q7114321.html #3

 読み込み時に配列に格納しないで、
 文字列として1行読み込んでから、(数値化し)配列に格納する例です。

 「m列目のデータ」の前には、m - 1 個の空白があるので、それをカウントし数値化します。
 (ただし、文字列には空白が連続しないこと)

 「実数」を「整数」に、「コンマ」を「空白」に置き換えればよいかと。

 http://www.bohyoh.com/CandCPP/C/Library/fgets.html
 http://www.bohyoh.com/CandCPP/C/Library/atoi.html

Qファイルの中身検索と表示

Cでの作成についてなんですが、
fopenでテキストファイルを開き、テキストの中身の
特定文字が含まれている行を新に作ったファイルの中に
書き込みたいんですが、テキストの中身の検索と
抽出方法がいろいろ試してみましたがわかりません。
よろしくお願いします。

Aベストアンサー

★文字列の検索関数を使えば良い。
・テキストの中身の検索は、行単位で文字列を取得(fgets)してから、この文字列内に
 検索文字列の有無をチェックします。この有無は文字列から文字列を検索する関数
 『strstr』関数を使うのが便利です。また、文字列から1文字の検索を行う場合は
 『strchr』関数を使います。質問では、特定の文字が含まれている行となっていますが
・検索するのは1文字、文字群、文字列のどれですか?
 これによっていろいろと代わりますよ。処理が…。
・とりあえず文字列から特定の文字列を含まれた行を抽出するサンプルを下に載せます。

サンプル:
char buff[ 256 ];
char *find = "検索文字列";
FILE *fp; ←読み込み用
FILE *fo; ←抽出用

省略(fopen×2つ)

while ( fgets(buff,sizeof(buff),fp) != NULL ){
 if ( strstr(buff,find) != NULL ){
  fputs( buff, fo );
 }
}

省略(fclose×2つ)

解説:
・上記のサンプルでは、行単位でテキストの中身を取得して、この文字列から検索文字列(find)が
 含まれるか『strstr()』関数でチェックしています。見つかると『NULL』以外を返します。
・そして、見つかったらば行単位で『fputs』関数で出力しています。
 これで見つかった行だけが、新たに作ったファイルに書き込まれていきます。→抽出です。
・また『strstr()』関数の部分を
 『if ( strchr(buff,'a') != NULL ){ … }』とすると『a』の文字が含まれる行のみを抽出します。
 『if ( strspn(buff,"+-*/") != 0 ){ … }』とすると『+-*/』の文字群が含まれる行のみを抽出します。
 検索する文字とは、1文字、文字群、文字列のどれですか?
・以上。おわり。→上記のを参考にして下さい。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strspn.html,http://www9.plala.or.jp/sgwr-t/c/sec17.html

★文字列の検索関数を使えば良い。
・テキストの中身の検索は、行単位で文字列を取得(fgets)してから、この文字列内に
 検索文字列の有無をチェックします。この有無は文字列から文字列を検索する関数
 『strstr』関数を使うのが便利です。また、文字列から1文字の検索を行う場合は
 『strchr』関数を使います。質問では、特定の文字が含まれている行となっていますが
・検索するのは1文字、文字群、文字列のどれですか?
 これによっていろいろと代わりますよ。処理が…。
・とりあえず文字列から特定...続きを読む

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

Qテキストファイルの行数を取得する方法(C言語

C言語でテキストファイルのトータル行数を取得する関数又はその方法を教えてほしいのですが。

宜しくお願いします。

Aベストアンサー

>C言語でテキストファイルのトータル行数を取得する関数又はその方法を教えてほしいのですが。

 3つ前の質問 http://okwave.jp/qa5129642.html 質問文中のソース冒頭 line2++; 部分(下に修正したもの掲載)で、

・テキストファイルの行数を、ファイルの頭から1行ずつ「読み捨て」て、それをファイル終端まで繰り返すことで数えています。

 ここでは、「全体として、どの位メモリを確保したらいいか」という動機から、超みっともない?こと(読み捨て、1ファイルを2度オープン)をしています。
  (本人には、http://okwave.jp/qa5114580.html の No.3 で指摘済み)
 1行ずつ読み込みながら、1行分のメモリを追加確保していくのが普通だと思うのですが・・。

・エディタでファイルを開けば判ることを、わざわさプログラムにする理由はなく、(質問文には現れない)主目的との「兼ね合い」でご質問された、と思います。
・「何々したいから、プログラムの冒頭で、ファイルのトータル行数を取得しておきたい」の「何々」部分を明らかにすれば、「兼ね合い」を解消する技法について「回答」が得られるかもしれません。

もし、上の質問者様と同様な動機でしたら、少なくとも、「エディタでファイルを開き、行数を確認」し、プログラム実行時にコマンドラインで、argv[ 2 ] に行数が入るようにして下さい。
超みっともない「読み捨て、1ファイルを2度オープン」は不要となります。

プログラムでは、line2 = atoi( argv[ 2 ] ); とすることで、行数を得ることができます(ファイル名は、argv[ 1 ] で)
----------------------------------------------
直球回答

int line2 = 0;
char buf[ 1024 ]; // 最大レコード長より大きいこと
FILE *fp;

if( NULL == ( fp = fopen( argv[ 1 ], "r" ) ) ){

 printf( "%s が開けません\n", argv[ 1 ] );

 return( -1 );
}
while( NULL != fgets( buf, 1024, fp ) ){

 line2++;
}
fclose( fp );

>C言語でテキストファイルのトータル行数を取得する関数又はその方法を教えてほしいのですが。

 3つ前の質問 http://okwave.jp/qa5129642.html 質問文中のソース冒頭 line2++; 部分(下に修正したもの掲載)で、

・テキストファイルの行数を、ファイルの頭から1行ずつ「読み捨て」て、それをファイル終端まで繰り返すことで数えています。

 ここでは、「全体として、どの位メモリを確保したらいいか」という動機から、超みっともない?こと(読み捨て、1ファイルを2度オープン)をしています。...続きを読む

Qファイル出力の場所を指定

現在C++にてhtmlファイルを出力するプログラムを作っているのですが、出力場所を指定することはできるのでしょうか?(現在はそのプログラムソースが保存されている場所と同じファイル内に出力されますが、それをデスクトップに出力するなど。)
もし、方法がありましたら、教えてください。
ソースや参考HPのURLなどのせていただけたらありがたいです。
環境はVisualStudio.NET2003です。
よろしくお願いします。

Aベストアンサー

単にファイル名の前にパスを指定する。

絶対パス指定
fp=fopen("c:/temp/test.txt","w");

相対パス指定
fp=fopen("./hoge/test.txt","w");


デスクトップはOSやユーザによって場所が異なるので、少し面倒です。
XPの場合環境変数を利用してこんな感じで出来ると思います。

例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
FILE *fp;
char fname[1024];
strcpy(fname,getenv("USERPROFILE"));
strcat(fname,"/デスクトップ/test.txt");
fp=fopen(fname,"w");
//処理
fclose(fp);
}

Qc言語でのfscanfについて

例えば
------------------
ほげほげ1
ほげほげ2
1,2
2,4
3,8
4,16
------------------
というデータファイルがあったとき3行目からのデータだけを抽出するにはc言語のfscanfでどのように書けばいいでしょうか?
簡単にでかまわないので、どなたか教えてください。

Aベストアンサー

1行目、2行目に空白がないのであれば、

int x,y;
fscanf(fp,"%*s %*s %d,%d ",&x,&y);

で、xに1、yに2が入ります。

QC++で、テキストファイルを一行ずつ読み込んで配列に入れたいのですが、

C++で、テキストファイルを一行ずつ読み込んで配列に入れたいのですが、うまくできません!

テキストには -3.0
       1.0
       2.0

・・・などのように一行に一つの数値が入って縦に並んでいます。
それをひとつずつ読み込み、新しい配列(たとえばa[])に順番にいれたいのです。

a[1]=-3.0,a[2]=1.0、・・・と
なるように。

どうか、この初心者にご指導お願いいたします。

Aベストアンサー

fgetsは文字列として読み込みます。これを数値に変換すれば、とりあえずあなたが望んでいることができます。変換はatofを使います。また、atofを使用するときは#include <stdlib.h>が必要です。
例えば
#include <stdlib.h>
  :
double d;
  :
d=atof("-3.0");
とすると、文字列の-3.0が数値の-3.0に変換されdに入ります。

fscanf関数で読み込んでもできますが、書式とデータがあっていないと上手くいかないので注意してください。

Qc言語 ファイルから数字を読み込む

c言語初心者です。
forループをつかって、
ファイルから空白で区切られた数字を一つずつ読み込む
プログラムを作りたいのですが、
forループの中をどう書いたらいいかわかりません。

#include <stdio.h>

int main (int argc, char *argv[])
{
char *fileName = argv[1];

FILE *fp = fopen("fileName", "r");

int num;
int i;

for(i=0; i<10; i++){
fscanf(fp, "%d", &num);
printf("%d\n", num);
}
fclose(fp);
}

ファイルの内容は、10個の数字が書かれている設定です。

Aベストアンサー

FILE *fp = fopen("fileName", "r");
は、
FILE *fp = fopen(fileName, "r");
でしょうね。
他はいいと思いますが。

細かいことを言うと、argv[1] を参照する前に、argcの値をチェックすべき。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング