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

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

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

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

943閲覧

int型配列の要素をテキストファイルへ書き込みたい

yama_07

総合スコア4

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2022/12/28 18:48

編集2022/12/28 18:49

前提

関数Writefileを使い、テイストファイルへint型配列に保持してある数値を書き込もうとしています。

疑問点

以下のソースコードを実行すると張り付けた写真のような出力結果になってしまい、望んだ数値が出力されません。
このような出力結果になってしまう原因とその解決策について知りたいです。

発生している問題・エラーメッセージ

エラーはないです。

該当のソースコード

c++

1 2#include<stdio.h> 3#include<windows.h> 4#include<tchar.h> 5#include<WinUser.h> 6#include <string> 7 8#include <stdlib.h> 9#include<iostream> 10using namespace std; 11 12 13 14int main(void) { 15 16 HANDLE hfile; 17 int* p; 18 int array[10], length; 19 DWORD dwWriteSize; 20 21 p = array; 22 length = 10; 23 24 for (size_t i = 0; i < length; i++) 25 { 26 p[i] = i; 27 cout << p[i] << endl; 28 } 29 30 // ファイルオープン 31 hfile = CreateFile( 32 _T("テスト.text"), // ファイルの名前 33 GENERIC_WRITE, // 書き込みモード 34 0, 35 NULL, 36 CREATE_ALWAYS, // 上書き保存 37 FILE_ATTRIBUTE_NORMAL, 38 NULL 39 ); 40 if (hfile == INVALID_HANDLE_VALUE) { 41 MessageBox(NULL, _T("ファイルの作成に失敗しました。"), _T("エラー"), MB_OK); 42 return 1; 43 } 44 45 // ファイルへ書き込み 46 WriteFile(hfile, p, (DWORD)sizeof(int) * length, &dwWriteSize, NULL); 47 48 // ファイルのクローズ 49 CloseHandle(hfile); 50 51 return 0; 52}

出力結果

イメージ説明

試したこと

配列の中身は問題なさそうなのでWritefileの引数に問題があると考えられますが、何が問題なのか分かりません。

補足情報(FW/ツールのバージョンなど)

開発環境: Visual Studio 2019
OS: Windows 11

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

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

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

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

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

setoppu

2022/12/28 21:54

『数値』と『数字』の違いは理解してますか? >Writefileの引数に問題があると考えられますが 数値としては正しくファイルに書き込みされていると思いますよ。 バイナリエディタで見るか、HexDumpなりで確認できると思いますが。 普通にテキストファイルとして出力したいのであれば、数値→数字変換したあとに書き出してください。 WriteFile()で…となると、変換したバッファとか気をつける必要がありますが。 そもそも、何も考えずに数値→数字変換しただけだと、配列の1つ目と2つ目の区別がつかないかも知れませんが。
dameo

2022/12/29 00:12

問題は以下の2つです。 (1) 数値型を文字列型のように整形せずに出力している点 (2) テキストではなくバイナリで出力している点 対策はいくつかありますが、WIN32APIだと(1)の整形や(2)のテキスト出力は自前でやる必要があります。 WIN32APIを直に使用せずC++標準ライブラリを使うなら、<fstream>を使えば可能です。 (1)の整形のみC++標準ライブラリを使うのであれば、<sstream>が使用できます。
yama_07

2023/01/01 12:35

「数値」と「数字」の違いについて意識していませんでした。ご丁寧に回答していただきありがとうございました。解決しました。
guest

回答2

1

WriteFile(hfile, p, (DWORD)sizeof(int) * length, &dwWriteSize, NULL);

これでは、テキストではなく、バイナリで書き込んでます
テキストに変換して書き込もう

投稿2022/12/28 22:30

y_waiwai

総合スコア87682

yama_07👍を押しています

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

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

yama_07

2023/01/01 12:36

勉強になりました。ありがとうございました。
guest

0

ベストアンサー

C++

1#include <Windows.h> 2#include <tchar.h> 3#include <string> 4#include <iostream> 5 6int main(void) { 7 8 const size_t length = 10; 9 int array[length]; 10 11 for (size_t i = 0; i < length; i++) { 12 array[i] = i; 13 std::cout << array[i] << std::endl; 14 } 15 16 // int[] -> string 17 std::string ints_str; 18 for ( int item : array ) { 19 ints_str += std::to_string(item) + " "; 20 } 21 22 // ファイルオープン 23 HANDLE hfile = CreateFile(_T("test.txt"), GENERIC_WRITE, 0, NULL, 24 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 25 if (hfile == INVALID_HANDLE_VALUE) { 26 MessageBox(NULL, _T("ファイルの作成に失敗しました。"), _T("エラー"), MB_OK); 27 return 1; 28 } 29 // ファイルへ書き込み 30 WriteFile(hfile, ints_str.data(), ints_str.size(), NULL, NULL); 31 // ファイルのクローズ 32 CloseHandle(hfile); 33 34 return 0; 35}

投稿2022/12/29 05:51

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.54%

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

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

質問する

同じタグがついた質問を見る

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。