fopenのエラーについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たいが
記事: 38
登録日時: 14年前
住所: 横浜

fopenのエラーについて

#1

投稿記事 by たいが » 14年前

たびたびすいません

コード:

#include <stdio.h>
#include <string.h>

//スクリプトは最大1000行まで読み込む
#define SCRIPT_MAX_LINE 1000
//スクリプト最大文字数
#define SCRIPT_MAX_STRING_LENGTH 300

typedef struct ScriptInformation_tag {
        int maxLineNumber;                      //スクリプト行数
        int currentLine;                        //現在何行目を実行しているか
        const char* filename;           //ファイル名
        char script[SCRIPT_MAX_LINE][SCRIPT_MAX_STRING_LENGTH];
} ScriptInformation;

//スクリプトファイルを読み込む
//戻り値 -1 : 失敗  0 : 成功
int loadScript(const char* filename, ScriptInformation* scriptInfo)
{
        int pos;
        char c;
        //スクリプトファイル
        FILE* fp;

        //スクリプト情報を初期化
        memset( scriptInfo , 0, sizeof(ScriptInformation) );

        //スクリプトファイルを開く
        fp = fopen(filename, "r");
        if( fp == NULL ) {
                //ファイル読み込みに失敗
                printf("スクリプト %s を読み込めませんでした\n", filename);
                return -1;
        }

        //script書き込み時に使用
        pos = 0;

        for( ;; ) {
                //一文字読み込み
                c = fgetc( fp );
                //ファイルの終わりかどうか
                if( feof( fp ) ) {
                        break;
                }

                if( pos >= SCRIPT_MAX_STRING_LENGTH - 1 ) {
                        //1行の文字数が多すぎる
                        printf("error: 文字数が多すぎます (%d行目)", scriptInfo->currentLine );
                        return -1;
                }

                //改行文字が出てきた場合,次の行へ移動
                if( c == '\n' ) {
                        //\0を文字列の最後に付ける
                        scriptInfo->script[ scriptInfo->currentLine ][ pos ] = '\0';
                        //次の行に移動
                        scriptInfo->currentLine++;
                        //書き込み位置を0にする
                        pos = 0;
                }else {
                        //書き込み
                        scriptInfo->script[ scriptInfo->currentLine ][ pos ] = c;
                        //文字書き込み位置をずらす
                        pos++;
                }
        }
        //最大行数
        scriptInfo->maxLineNumber = scriptInfo->currentLine;
        //読み込み中の行を0にする
        scriptInfo->currentLine = 0;
        //スクリプトファイル名を設定
        scriptInfo->filename = filename;
        return 0;
}

int main()
{
        int i;
        ScriptInformation script;

        loadScript( "../dat/script.txt", &script );

        //10行目までを表示
        for( i = 0; i < 10; i++ ) {
                printf("%d : %s\n", i + 1, script.script[i] );
        }

        return 0;
}

http://karetta.jp/book-node/game-programming/235355
ここのやつのパスを変えただけなんですが
以下のようなエラーが出てしまいます

1>------ ビルド開始: プロジェクト: novel, 構成: Debug Win32 ------
1> novel.cpp
1>c:\users\desktop\novel\novel.cpp(29): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(234) : 'fopen' の宣言を確認してください。
1>LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
1>C:\Users\Desktop\ノベル第一弾\novel\Debug\novel.exe : fatal error LNK1120: 外部参照 1 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========


原因がわからないんですが何故でしょうか?

ぬっち
記事: 105
登録日時: 14年前
連絡を取る:

Re: fopenのエラーについて

#2

投稿記事 by ぬっち » 14年前

1>c:\users\desktop\novel\novel.cpp(29): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

これは、fopenを使うよりもfopen_sを代わりに使ったほうが安全ですよ、ということです。
fopenを使用しても問題はありません。
_CRT_SECURE_NO_WARNINGSをdefineすれば、この警告は消えます。
http://msdn.microsoft.com/en-us/magazine/cc163588.aspx
ここに、その詳細が書いてありました。
複数のプログラムで、同じファイルを開いた時に衝突することが危険らしいです。

1>LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
1>C:\Users\Desktop\ノベル第一弾\novel\Debug\novel.exe : fatal error LNK1120: 外部参照 1 が未解決です。

これは、Visual StudioでWindowsアプリケーションを指定しているのではないでしょうか?
今回の場合はint mainとなっているので、コンソールアプリケーションを指定すべきですよね?

たいが
記事: 38
登録日時: 14年前
住所: 横浜

Re: fopenのエラーについて

#3

投稿記事 by たいが » 14年前

コンソールアプリケーションを指定とはどうやるのでしょう?
素人なもんで・・・

ぬっち
記事: 105
登録日時: 14年前
連絡を取る:

Re: fopenのエラーについて

#4

投稿記事 by ぬっち » 14年前

プロジェクトの設定の時に指定しませんでしたっけ?
Visual C++ 2010であれば、新しいプロジェクトで、「Win32 コンソール アプリケーション」→Win32 アプリケーションウィザードでアプリケーションの種類の「コンソール アプリケーション」で出来ます。

たいが
記事: 38
登録日時: 14年前
住所: 横浜

Re: fopenのエラーについて

#5

投稿記事 by たいが » 14年前

今拝見させていただきました
今まで新しく作る時は

http://homepage2.nifty.com/natupaji/DxL ... ress.htmlの
 ③ ダイアログ右側の項目から『Win32 プロジェクト』を選びます。
を見て、プロジェクトを選んでいたんですが、これをコンソールアプリケーションでやらないといけない
ということでしょうか?
今までのは間違っていたんですかねえ・・・特にエラーも出なかったんですけど


そしてそして、とにもかくにもコンソールアプリケーションでやってみたのですが、デバッグするとエラーは出ないんですが、ほんの一瞬しか画面(コンソール?)が表示されません。
これはどういうことでしょうか?

拙くてすいませんがよろしくお願いします

たいが
記事: 38
登録日時: 14年前
住所: 横浜

Re: fopenのエラーについて

#6

投稿記事 by たいが » 14年前

いや、すいません 言ってることがやっと理解できました!

多分ですが今回これwinmainとか使ってないからってことですよね?
だからDXライブラリを扱う感じというよりは普段Cを扱う時みたいにすればいいってことですよね

なんか勝手に解決してすみません
一応解決にしますが、この考え間違ってたらガンガン突っ込んでくれていいんでお願いします
ありがとうございました

ぬっち
記事: 105
登録日時: 14年前
連絡を取る:

Re: fopenのエラーについて

#7

投稿記事 by ぬっち » 14年前

たいがさんの仰るとおりwinmainを使用する場合は、Windows アプリケーションを選択します。
それでmainを使用する場合は、コンソールアプリケーションを選択します。

もう既に解決していると思いますが、コンソール画面が一瞬で消えてしまうことに対しては、「デバッグなしで開始」を行えば多分、たいがさんが期待している結果が得られるのではないでしょうか?

polpol

Re: fopenのエラーについて

#8

投稿記事 by polpol » 14年前

この掲示板でコンソールアプリケーションと検索したら出てきました↓
http://dixq.net/vcpp.html
(実は僕もこのやり方最近知りました;;)

たいが
記事: 38
登録日時: 14年前
住所: 横浜

Re: fopenのエラーについて

#9

投稿記事 by たいが » 14年前

あ、前から思ってたんですが、2010の場合デバッグなしで開始ってなくないですか?
見当たらないんですが・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: fopenのエラーについて

#10

投稿記事 by softya(ソフト屋) » 14年前

ツール→設定→上級者用の設定で「デバッグなしで開始」が見えるようになります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

たいが
記事: 38
登録日時: 14年前
住所: 横浜

Re: fopenのエラーについて

#11

投稿記事 by たいが » 14年前

ありがとうございます
地味に悩んでたので助かりましたww

閉鎖

“C言語何でも質問掲示板” へ戻る