現在C++でアプリケーションを作っています.
その工程の一つとしてcsvファイルにゲームのクリア回数とハイスコアの2つの数字を置いておくだけのファイルを読み書きする関数を作っているのですが、見たこともないエラーが飛んできて参っています.
コードの手順としては,セーブデータのクリア回数を参照してそれに1を足して再びセーブデータに入力.
またゲームで出たスコア(引数のx)がセーブデータにあるハイスコアよりも低ければ(今回は低いほどよい)更新して入力する.
といった感じです.
全てのソースコードを載せるには長すぎるのでファイル入出力の関数のみ記載します.
C++
1#pragma once 2 3#include <stdio.h> 4#include <tchar.h> 5#include <stdlib.h> 6#include <windows.h> 7 8#define BUFFSIZE 1024 9 10//ファイル取得に失敗した時にエラーメッセージを返したいので,bool型で定義 11bool fileoutput(int x);
C++
1#include "file.h" 2 3//セーブデータ(csv)へクリア回数(+ハイスコア)をアウトプットする 4//引数は比較のための暫定ハイスコア 5bool fileoutput(int x) 6{ 7 //どのパスのどのファイルか,を示す文字列を設定 8 char inputdata[_MAX_PATH]; 9 //カレントディレクトリの取得(exeフォルダと入力csvファイルは同じフォルダとする) 10 char currentDir[_MAX_PATH]; 11 GetCurrentDirectory(sizeof(currentDir), currentDir); 12 //ファイルパスの作成 13 sprintf_s(inputdata, "%s\SaveData.csv", currentDir); 14 15 //クリア回数とハイスコア 16 int data[2]; 17 18 //ファイルオープン 19 FILE* fp; 20 char buf[BUFFSIZE]; 21 22 errno_t error = fopen_s(&fp, inputdata, "r"); //読み取りとして開く 23 if (error != 0) return false; 24 25 char s_delim[] = ","; // 区切り文字 26 char* s; 27 28 //読み込み開始 29 fgets(buf, BUFFSIZE, fp); //「 Clear回数, 0 」 30 char* p_work = strtok_s(buf, s_delim, &s); 31 p_work = strtok_s(NULL, s_delim, &s); // クリア回数 (初期値は0) 32 33 data[0] = atoi(p_work) + 1; 34 35 //2行目へ移動 36 fgets(buf, BUFFSIZE, fp); //「 ハイスコア, 100 」 37 p_work = strtok_s(NULL, s_delim, &s); 38 p_work = strtok_s(NULL, s_delim, &s); // ハイスコア (初期値は100で小さいほど良い) 39 40 data[1] = atoi(p_work); 41 42 fclose(fp); 43 44 error = fopen_s(&fp, inputdata, "w"); //書き込みとして開く 45 if (error != 0) return false; 46 47 //クリア回数を + 1 48 char s_buf[BUFFSIZE]; 49 sprintf_s(s_buf, "Clear回数,%d", data[1]); 50 fputs(s_buf, fp); 51 52 //スコアを更新するとセーブデータに上書き 53 if (x < data[1]) 54 { 55 sprintf_s(s_buf, "Clear回数,%d", x); 56 fputs(s_buf, fp); 57 } 58 //ファイルクローズ 59 fclose(fp); 60 61 return true; 62}
エラーはなぜかコピペできないので手動で書きます
error
1Debug Assertion Failed! 2 3Program: ...OneDrive/デスクトップ/...(中略).../○○.exe 4File: minkernel/crts/ucrt/inc/correct_internal_strtox.h 5Line:1772 6 7Excepssion; _p != nullptr 8 9For information on how your program can cause an assertion failure, 10see the Visual C++ documentation asserts. 11 12(Press Retry to debug the application) 13 14 中止(A) 再試行(R) 無視(I)
よろしくお願いします.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。