サンプル集  >  VC  >  ファイルの中身を表示る
ファイルの中身を表示する
2003/10/19

ファイルを読み込み内容を表示します。

P014.cpp
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
/* PROGRAM NAME : P014.cpp   */
/* AUTHOR       : ymlib.com  */
/* MAKE DAY     : 1996/07/11 */

/*                            */
/*  ファイルの中身を表示する  */
/*                            */

#include <stdio.h>
#include <stdlib.h>

void main(int argc, char*argv[]) {
    if (argc < 2) {
        fprintf(stderr, "ファイル名を入力して下さい。\n");
        exit (0);
    }

    FILE*fp = fopen(argv[1], "r");
    if (fp == NULL) {
        fprintf(stderr, "%s ファイルがありません。\n", argv[1]);
        exit(0);
    }
    int c;
    while ((c = fgetc(fp)) != EOF) {
        putchar(c);  /* 画面に出す */
    }
    fclose (fp);
}


2010/01/29 追記

Visual C++ 2008 Express Edition でテストしてみます。

◆環境
OS Windows XP Professional Version 2002 Service Pack 3
VC Microsoft Visual Studio 2008 Version 9.0.30729.1 SP

[Win32] - [Win32 コンソール アプリケーション] でプロジェクトを作りソースを貼り付けます。

コンパイルエラーが出ました。

1>P014.cpp
1>c:\p014\p014\p014.cpp(10) : warning C4627: '#include <stdlib.h>': プ
リコンパイル済みヘッダーの使用を検索中にスキップされました
1>        ディレクティブを 'stdafx.h' に追加するか、プリコンパイル済み
ヘッダーをビルドし直します
1>c:\p014\p014\p014.cpp(29) : fatal error C1010: プリコンパイル ヘッダ
ーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソー
スに追加しましたか?

そういえば、プロジェクト生成時に自動で作られた main 関数を含むファイルは次のものでした。

P014.cpp
 1: 

 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
// P014.cpp : コンソール アプリケーションのエントリ ポイントを定
義します。

//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

生成直後のソースでは stdafx.h がインクルードされています。

色々調べていたら、プロジェクト作成時に「プリコンパイル済みヘッダー(H)」のチェックを外せば普通の include で良いという情報を目にしました。 プロジェクトを再作成してみます。

チェックを外して再作成し、コンパイルしたところ別のエラーが出ました。

1>P014.cpp
1>c:\p014\p014\p014.cpp(18) : warning C4996: 'fopen': This function or 
variable may be unsafe. Consider using fopen_s instead. To disable de
precation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>        c:\program files\microsoft visual studio 9.0\vc\include\stdio
.h(237) : 'fopen' の宣言を確認してください。

fopen 関数の代わりに fopen_s 関数を使うべきなようです。 fopen_s 関数を使うようにプログラムを修正します。

P014.cpp
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
/* PROGRAM NAME : P014.cpp   */
/* AUTHOR       : ymlib.com  */
/* MAKE DAY     : 1996/07/11 */

/*                            */
/*  ファイルの中身を表示する  */
/*                            */

#include <stdio.h>
#include <stdlib.h>

void main(int argc, char*argv[]) {
    if (argc < 2) {
        fprintf(stderr, "ファイル名を入力して下さい。\n");
        exit (0);
    }

    FILE*fp;
    errno_t ret = fopen_s(&fp, argv[1], "r");
    if (ret != 0) {
        fprintf(stderr, "%s ファイルがありません。\n", argv[1]);
        exit(0);
    }
    int c;
    while ((c = fgetc(fp)) != EOF) {
        putchar(c);  /* 画面に出す */
    }
    fclose (fp);
}

修正後、コンパイルをしたところ問題なく通ったので実行してみます。 表示するファイルは、今回作ったプログラムを指定してみます。

>P014.exe P014.cpp
/* PROGRAM NAME : P014.cpp   */
/* AUTHOR       : ymlib.com  */
/* MAKE DAY     : 1996/07/11 */

/*                            */
/*  ファイルの中身を表示する  */
/*                            */

#include <stdio.h>
#include <stdlib.h>

void main(int argc, char*argv[]) {
    if (argc < 2) {
        fprintf(stderr, "ファイル名を入力して下さい。\n");
        exit (0);
    }

    FILE*fp;
    errno_t ret = fopen_s(&fp, argv[1], "r");
    if (ret != 0) {
        fprintf(stderr, "%s ファイルがありません。\n", argv[1]);
        exit(0);
    }
    int c;
    while ((c = fgetc(fp)) != EOF) {
        putchar(c);  /* 画面に出す */
    }
    fclose (fp);
}

指定したファイルの内容が正しく表示されました。

▲ PageTop  ■ Home


Copyright (C) 2012 ymlib.com