0から始めるVisualStudio2022:ソフト開発塾

ファイルの読み込みプログラム(Console)をエラーが出ないように修正してみた。
(SDLチェックを「はい」で、エラーが出ないように修正)
いつものように、『ファイル』『追加』『新しいプロジェクト』
C++の空のプロジェクトを選んで
sample009のプロジェクトを作成
sample009を『プロジェクト』『スタートアッププロジェクトに設定』で変更しておく
sample002のソースファイル sample002.cpp を、
sample009に、コピーして、sample009.cppにする。
で、このまま ビルドしてみる。
すると、エラー表示を確認
1>sample009.cpp
1>C:\softca\sample\sample009\sample009.cpp(11,60): warning C4267: '=': 'size_t' から 'int' に変換しました。データが失われているかもしれません。
1>C:\softca\sample\sample009\sample009.cpp(4,12): error 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:\softca\sample\sample009\sample009.cpp(27,5): error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>プロジェクト "sample009.vcxproj" のビルドが終了しました -- 失敗。
まずは、4行目
	if ((fp = fopen("sample002.cpp", "rb")) == NULL) {
の、fopen の代わりに fopen_s を使用する
	if ((fopen_s(&fp,"sample009.cpp", "rb")) != 0) {
ついでに、読み込むファイル名も変更した。
27行目
				sprintf(ptr, "%02x ", ch);
の、sprintf の代わりに sprintf_s を使用する
				sprintf_s(ptr, 4, "%02x ", ch);
これで、ビルド エラーは無くなった。

#include <stdio.h>
int main() {
	FILE *fp;
	if ((fopen_s(&fp,"sample009.cpp", "rb")) != 0) {
			printf("Error : File Open\n");
		return 1;
	}else{
		int	mm_leng;
		unsigned char mm_read_buff[48][16];
		char mm_output_buff[16 + 16 * 3 + 16 + 7];
		mm_leng = fread(mm_read_buff, 1,sizeof(mm_read_buff), fp);
		mm_output_buff[16] = ' ';
		mm_output_buff[17] = '|';
		mm_output_buff[18] = ' ';
		int y = 0;
		int j=16;
		for (int i = 0; i < mm_leng; i += 16) {
			char *ptr = mm_output_buff+19;
			for ( j = 0; j < 16; j++) {
				if (y * 16 + j >= mm_leng)	break;
				unsigned short ch = (unsigned short) mm_read_buff[y][j];
				if (ch > 0x7e || ch < 0x20) {
					mm_output_buff[j] = '.';
				}else {
					mm_output_buff[j] = (char ) ch;
				}
				sprintf_s(ptr, 4, "%02x ", ch);
				ptr += 3;
			}
			printf("%4x %s\n",y, mm_output_buff);
			y++;
		}
		if (j < 16) {
			for (; j < 16; j++) {
				mm_output_buff[j] = ' ';
			}
			printf("%4x %s\n",y, mm_output_buff);
		}
		fclose(fp);
	}
}
ただ、この程度で、専用の関数を使用しないといけないことに、疑問を感じる。






Top