fopenでテキストファイルをよみこめない。

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

fopenでテキストファイルをよみこめない。

#1

投稿記事 by ほりでい » 4年前

コード:

 
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#define GLOBAL_INSTANCE
#include "GV.h"

/*"GV.h"
#include "struc.h"
#include <stdio.h>
#include "DxLib.h"
#include "define.h"・・・・
*/ 

 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE); // ウィンドウモードに設定
	DxLib_Init();
 
 while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {
 	char HANDL[] = "読み込み失敗";

	FILE* fp; // FILE型構造体
	char fname[] = "2.txt";

	fp = fopen("2.txt", "r"); // ファイルを開く。失敗するとNULLを返す。
	if (fp == NULL) {
		DrawFormatString(0, 0, GetColor(255, 255, 255), "%s", HANDL);
		return ;
	}
	else {
		DrawFormatString(0, 0, GetColor(255, 255, 255), "%s", HANDL);
	}
	fclose(fp); // ファイルを閉じる

 	WaitKey();
	}
	DxLib_End();   // DXライブラリ終了処理
	return 0;
}
 

DXライブラリを使うとファイルが開けなくなってしまいます。新規ファイルで、DXライブラリ関数を使わずC++でソースコードを作り、実行すると正常に読み込みができます。テキストファイルの保存場所も間違っていないと思います。テキストファイルには「123456789123456789」が入っています。
いろいろ試しましたが、まったくわかりません。間違っている箇所があればどなたか教えてください。<(_ _)>

box
記事: 2002
登録日時: 13年前

Re: fopenでテキストファイルをよみこめない。

#2

投稿記事 by box » 4年前

何をもってファイルが読み込めないとしているのかはわかりかねますが、

コード:

if (fp == NULL) {
		DrawFormatString(0, 0, GetColor(255, 255, 255), "%s", HANDL);
		return ;
	}
	else {
		DrawFormatString(0, 0, GetColor(255, 255, 255), "%s", HANDL);
	}
このコードって、ファイルがオープンできてもできなくても
「読み込み失敗」って出るような気がするのは気のせいでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Math

Re: fopenでテキストファイルをよみこめない。

#3

投稿記事 by Math » 4年前

過去ログで何度も説明したようにデバッグ用にコンソールを表示すればよくわかりますよ。

プログラムを訂正して

main.cpp

コード:

#define _CRT_SECURE_NO_WARNINGS

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
    // コンソール開きなをして表示
    AllocConsole();
    FILE* out = 0; freopen_s( &out, "CON", "w", stdout );
    

    ChangeWindowMode( TRUE );    printf("\n\n[010] ウィンドウモード\n\n");

    DxLib_Init();    printf("[020] DXライブラリ初期化\n\n");

    SetDrawScreen( DX_SCREEN_BACK );    printf("[021] ***** 裏画面設定 ***\n\n");

 // while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {

    char HANDL[] = "FILE開けません"; // 読み込み失敗";
    FILE* fp;    printf("[030] FILE型構造体 宣言\n\n");
    char fname[] = "2.txt";

    fp = fopen("2.txt", "r");    printf("[040] ファイルを開く。失敗するとNULLを返す。\n\n");
    if (fp == NULL) {
        DrawFormatString(0, 0, GetColor(255, 255, 255), "%s", HANDL);
        return 1;
    }
    else {[code][code]
        // DrawFormatString(0, 0, GetColor(255, 255, 255), "%s", HANDL);
		 DrawFormatString(0, 0, GetColor(255, 255, 255), "%s", "開けたよ");
    }

    char yomikomu_mojiretu[32]; fscanf(fp, "%s", &yomikomu_mojiretu);
    printf("[041] ***** よみこむ ***  %s \n\n",yomikomu_mojiretu);


    fclose(fp);    printf("[050] ファイルを閉じる");

  int x=0;

    printf(" while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )");
    while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

            DrawString(30, 20, yomikomu_mojiretu, GetColor(255, x, 255)); // 文字を書く
         x++; if(x > 255){ x=0;}
    }

    WaitKey();     printf("[060] キー入力があるまで待機\n\n");
    DxLib_End();   printf("[070] DXライブラリ終了処理\n\n");

    printf("[080]コンソール解放\n\n");
    fclose( out ); FreeConsole();

    return 0;
} 
VS2019Community で実行(x64)

コード:


**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.3.10
** Copyright (c) 2019 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>cd C:\19\VS2019\z\19\11\29

C:\19\VS2019\z\19\11\29>g

C:\19\VS2019\z\19\11\29>nmake -f g.mak

Microsoft(R) Program Maintenance Utility Version 14.23.28107.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl /c /TP /EHsc /D "_MBCS" /MT  /Ic:\dxlib /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3 main.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.23.28107 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
        link /out:main.exe /SUBSYSTEM:WINDOWS /LIBPATH:c:\dxlib "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" main.obj
Microsoft (R) Incremental Linker Version 14.23.28107.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        main.exe

C:\19\VS2019\z\19\11\29>

コンソール

コード:



[010] ウィンドウモード

[020] DXライブラリ初期化

[021] ***** 裏画面設定 ***

[030] FILE型構造体 宣言

[040] ファイルを開く。失敗するとNULLを返す。

[041] ***** よみこむ ***  123456789123456789

[050] ファイルを閉じる while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )


Math

Re: fopenでテキストファイルをよみこめない。

#5

投稿記事 by Math » 4年前

こんな事なら初めからコンソール・プログラムで作ったほうがいいという
かたのために DXライブラリ を int main() コンソール・プログラムにしてみました。

main.cpp

コード:

#define _CRT_SECURE_NO_WARNINGS

#include "DxLib.h"

int main()
{

    ChangeWindowMode( TRUE );    printf("\n\n[010] ウィンドウモード\n\n");

    DxLib_Init();    printf("[020] DXライブラリ初期化\n\n");

    SetDrawScreen( DX_SCREEN_BACK );    printf("[021] ***** 裏画面設定 ***\n\n");

 // while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {

    char HANDL[] = "FILE開けません"; // 読み込み失敗";
    FILE* fp;    printf("[030] FILE型構造体 宣言\n\n");
    char fname[] = "2.txt";

    fp = fopen("2.txt", "r");    printf("[040] ファイルを開く。失敗するとNULLを返す。\n\n");
    if (fp == NULL) {
        DrawFormatString(0, 0, GetColor(255, 255, 255), "%s", HANDL);
        return 1;
    }
    else {
        // DrawFormatString(0, 0, GetColor(255, 255, 255), "%s", HANDL);
		 DrawFormatString(0, 0, GetColor(255, 255, 255), "%s", "開けたよ");
    }

    char yomikomu_mojiretu[32]; fscanf(fp, "%s", &yomikomu_mojiretu);
    printf("[041] ***** よみこむ ***  %s \n\n",yomikomu_mojiretu);


    fclose(fp);    printf("[050] ファイルを閉じる\n\n");

  int x=0;

    printf("[051] while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )\n\n");
    while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

            DrawString(30, 20, yomikomu_mojiretu, GetColor(255, x, 255)); // 文字を書く
         x++; if(x > 255){ x=0;}
    }

    WaitKey();     printf("[060] キー入力があるまで待機\n\n");
    DxLib_End();   printf("[070] DXライブラリ終了処理\n\n");

    return 0;
} 
makefile
cg.mak

コード:

TARGETNAME=main

C_FLAGS=/c /TP /EHsc /D "_MBCS" /MT  /Ic:\dxlib /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /W3 

LINK_FLAGS=/SUBSYSTEM:CONSOLE /LIBPATH:c:\dxlib "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" 

ALL:
	cl $(C_FLAGS) $(TARGETNAME).cpp 
	link /out:$(TARGETNAME).exe $(LINK_FLAGS) $(TARGETNAME).obj 
	$(TARGETNAME).exe
実行 VS2019Community (x64)

コード:

**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.3.10
** Copyright (c) 2019 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>cd C:\19\VS2019\z\19\11\30

C:\19\VS2019\z\19\11\30>cg

C:\19\VS2019\z\19\11\30>nmake -f cg.mak

Microsoft(R) Program Maintenance Utility Version 14.23.28107.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl /c /TP /EHsc /D "_MBCS" /MT  /Ic:\dxlib /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /W3 main.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.23.28107 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
        link /out:main.exe /SUBSYSTEM:CONSOLE /LIBPATH:c:\dxlib "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" main.obj
Microsoft (R) Incremental Linker Version 14.23.28107.0
Copyright (C) Microsoft Corporation.  All rights reserved.

LIBCMT.lib(exe_main.obj) : error LNK2019: 未解決の外部シンボル main が関数 "int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ) で参照されました。
main.exe : fatal error LNK1120: 1 件の未解決の外部参照
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\bin\HostX64\x64\link.EXE"' : リターン コード '0x460'
Stop.

C:\19\VS2019\z\19\11\30>cg

C:\19\VS2019\z\19\11\30>nmake -f cg.mak

Microsoft(R) Program Maintenance Utility Version 14.23.28107.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl /c /TP /EHsc /D "_MBCS" /MT  /Ic:\dxlib /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /W3 main.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.23.28107 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
main.cpp(49): error C2065: 'out': 定義されていない識別子です。
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\bin\HostX64\x64\cl.EXE"' : リターン コード '0x2'
Stop.

C:\19\VS2019\z\19\11\30>cg

C:\19\VS2019\z\19\11\30>nmake -f cg.mak

Microsoft(R) Program Maintenance Utility Version 14.23.28107.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl /c /TP /EHsc /D "_MBCS" /MT  /Ic:\dxlib /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /W3 main.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.23.28107 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
        link /out:main.exe /SUBSYSTEM:CONSOLE /LIBPATH:c:\dxlib "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" main.obj
Microsoft (R) Incremental Linker Version 14.23.28107.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        main.exe


[010] ウィンドウモード

[020] DXライブラリ初期化

[021] ***** 裏画面設定 ***

[030] FILE型構造体 宣言

[040] ファイルを開く。失敗するとNULLを返す。

[041] ***** よみこむ ***  123456789123456789

[050] ファイルを閉じる

[051] while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )



実行結果
http://www2.koyoen.birdview.co.jp/~abcx ... %83%A3.PNG

ほりでい
記事: 15
登録日時: 4年前

Re: fopenでテキストファイルをよみこめない。

#6

投稿記事 by ほりでい » 4年前

なんとか実行できました。助かりました。
分かりやすい解説ありがとうございました。(人''▽`)

返信

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