質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

3回答

827閲覧

C++ ファイル書き込みについて

00_x9925

総合スコア12

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/06/26 22:59

現在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)

よろしくお願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

どこかでポインタの扱いを間違って、ライブラリの奥の方でエラーになってるんでしょう。その視点でみたとき、

C

1 //読み込み開始 2 fgets(buf, BUFFSIZE, fp); //「 Clear回数, 0 」 3 char* p_work = strtok_s(buf, s_delim, &s); 4 p_work = strtok_s(NULL, s_delim, &s); // クリア回数 (初期値は0) 5 6 data[0] = atoi(p_work) + 1; //??? p_workは絶対にNULLにはならない? 7 8 //2行目へ移動 9 fgets(buf, BUFFSIZE, fp); //「 ハイスコア, 100 」 10 p_work = strtok_s(NULL, s_delim, &s); //??? bufをいじったのにこれでいいの? 11 p_work = strtok_s(NULL, s_delim, &s); // ハイスコア (初期値は100で小さいほど良い) 12 13 data[1] = atoi(p_work);//??? p_workは絶対にNULLにはならない?

投稿2020/06/27 01:08

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SaveData.csv のナカミが正しいか、確認しましたか?

投稿2020/06/27 00:55

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答ではないですが、、
VisualStudioを使ってるなら、適当な場所にブレークポイントを設定し、そこで実行を止め、ワンステップづつ実行させて、その例外が出る場所を特定していきます
特定できれば、例外が出る直前で実行を止めて、そこで使っているあるいはその周辺で使っている変数の内容をチェックし、異常がないかを見ます。
異常がある場合は、それを修正しましょう

投稿2020/06/26 23:53

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問