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

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

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

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

解決済

printfで出力した文字が文字化けする。

hanamur
hanamur

総合スコア41

C++

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

1回答

0評価

0クリップ

500閲覧

投稿2022/07/27 01:54

編集2022/08/08 07:51

C++でプログラミングしているのですが、printfで出力した文字が文字化けします。
visual studio2019を使っています。
一般的に文字化けの起こる原因か解決方法、どちらかでもよいのでどうかよろしくお願いします。
以下、一応そのようなことが起こった該当のソースコードを書きますが、あまり質問の本筋と関係ない部分が多い上に長いので読み飛ばしていただいて結構です。
これでコマンドプロンプトで
main.exe 2
と実行した場合は予定通りの出力がコマンドプロンプト上に行われるのですが、
main.exe 2 >aaa.txt
とした場合はaaa.txtに文字化けが出力されます。
main.exe 3 >aaa.txt
の場合は問題なく出力されます。
どうかよろしくお願いします。

main.cpp

#include <iostream> #include <stdio.h> #include <stdlib.h> #include<string.h> #include<time.h> #include <algorithm> #define _USE_MATH_DEFINES #include <math.h> #define atomOSD 50 #define banedOSD 300 #define outerOSDnum 9 #define baseOSD 25 #define halfOSD 12.5 using namespace std; typedef struct { int i1[12]; } str1; typedef struct { float X; float Y; } XandY; typedef struct { float katamuki; float seppen; } PathParam; XandY* idealp; int idealN; str1* strc2; str1* strc3; int* strc1; //FILE* preDISTANCE; float* taiou; int m; void subsubsub(int preFOSDnum, int preSOSDnum, int preFnum, int preSnum) { int Fnum = preFnum * 6; int Snum = preSnum * 6; int ALLN = Fnum + Snum; float FOSD = taiou[preFOSDnum]; float SOSD = taiou[preSOSDnum]; int i, j, k, n; long long l; double epsilon = 1e-5; float x, y; int nantonaku = 900; float FRADs = 2 * M_PI / Fnum; float SRADs = 2 * M_PI / Snum; PathParam* PP; PP = new PathParam[ALLN]; k = 0; l = FOSD / 500; for (j = 0; j < Fnum; j++) { if (fabs(cos(FRADs * j + l * M_PI / 2)) > epsilon) { PP[k].katamuki = tan(FRADs * j + l * M_PI / 2); PP[k++].seppen = -FOSD / cos(FRADs * j + l * M_PI / 2); } else { PP[k].katamuki = INFINITY; PP[k++].seppen = FOSD / sin(FRADs * j + l * M_PI / 2); } } l = SOSD / 500; for (j = 0; j < Snum; j++) { if (fabs(cos(SRADs * j + l * M_PI / 2)) > epsilon) { PP[k].katamuki = tan(SRADs * j + l * M_PI / 2); PP[k++].seppen = -SOSD / cos(SRADs * j + l * M_PI / 2); } else { PP[k].katamuki = INFINITY; PP[k++].seppen = SOSD / sin(SRADs * j + l * M_PI / 2); } } XandY* IS; IS = new XandY[ALLN * ALLN]; k = 0; for (i = 0; i < ALLN - 1; i++) { for (j = i + 1; j < ALLN; j++) { if (isinf(PP[i].katamuki) && isinf(PP[j].katamuki)); else if (fabs(PP[i].katamuki - PP[j].katamuki) < epsilon); else if (isinf(PP[i].katamuki)) { x = PP[i].seppen; y = PP[j].katamuki * x + PP[j].seppen; if (x * x + y * y < 810000) { IS[k].X = x; IS[k++].Y = y; } } else if (isinf(PP[j].katamuki)) { x = PP[j].seppen; y = PP[i].katamuki * x + PP[i].seppen; if (x * x + y * y < 810000) { IS[k].X = x; IS[k++].Y = y; } } else { x = (PP[j].seppen - PP[i].seppen) / (PP[i].katamuki - PP[j].katamuki); y = PP[i].katamuki * x + PP[i].seppen; if (x * x + y * y < 810000) { IS[k].X = x; IS[k++].Y = y; } } } } printf("%d %d %d %d ", preFnum, preSnum, preFOSDnum, preSOSDnum); if (k == 0) { for (i = 0; i < idealN; i++)printf("%d ", 900); printf("\n"); std::cerr << "yatta-" << std::endl; } else { for (i = 0; i < idealN; i++) { n = nantonaku * nantonaku - 1; for (j = 0; j < k; j++) { l = (IS[j].X - idealp[i].X) * (IS[j].X - idealp[i].X) + (IS[j].Y - idealp[i].Y) * (IS[j].Y - idealp[i].Y); if (l < n)n = l; } n = sqrt(n); printf("%d ", n + 1); } printf("\n"); } delete[] IS; delete[] PP; } void subsub(int preFOSDnum, int preSOSDnum, int num) { int i, j; for (i = 1; i < 24 - num; i++) { for (j = 1; j < 25 - num - i; j++) { subsubsub(preFOSDnum, preSOSDnum,i, j); cerr << preFOSDnum << " " << preSOSDnum << " " << i << " " << j << " " << m++ << endl; } } } void sub(int num) { FILE* narrow; errno_t error = fopen_s(&narrow, "narrow.txt", "r"); if (error != 0)exit(1); int a0, a1, a2; float a3; strc1 = new int[13]; strc2 = new str1[12]; strc3 = new str1[12]; memset(strc1, 0, sizeof(int) * 13); memset(strc2, 0, sizeof(str1) * 12); memset(strc3, 0, sizeof(str1) * 12); while (fscanf_s(narrow, "%d %d %d %f", &a0, &a1, &a2, &a3) != EOF) { if (a0 == num) { strc1[a1 + 1]++; strc2[a1].i1[a2]++; } } fclose(narrow); int i, j, k, l; for (i = 1; i < num + 1; i++) { strc1[i] += strc1[i - 1]; } taiou = new float[strc1[i - 1] * 2]; for (i = 0; i < 12; i++) { k = 0; for (j = 0; j < 12; j++) { if (strc2[i].i1[j] == 1)strc3[i].i1[k++] = j; } } k = 0; for (i = 0; i < num; i++) { for (j = 0; j < strc1[i + 1] - strc1[i]; j++) { l = strc3[i].i1[j] / outerOSDnum; taiou[k++] = strc3[i].i1[j] * atomOSD + l * banedOSD + baseOSD - halfOSD; taiou[k++] = strc3[i].i1[j] * atomOSD + l * banedOSD + baseOSD + halfOSD; } } for (i = 1; i < num + 1; i++)strc1[i] *= 2; for (i = 1; i < num + 1; i++)printf("%d\n", strc1[i]); for (i = 0; i < num - 1; i++) { for (j = strc1[i]; j < strc1[i + 1]; j++) { for (k = i + 1; k < num; k++) { for (l = strc1[k]; l < strc1[k + 1]; l++) { subsub(j,l,num); } } } } delete[]strc1; delete[]strc2; delete[]strc3; delete[]taiou; } int main(int argc, char* argv[]) { clock_t start = clock(); m = 0; int i; idealN = 0; float* idealX2, * idealY2; idealX2 = new float[131 * 131]; idealY2 = new float[131 * 131]; FILE* idealplots; errno_t error; error = fopen_s(&idealplots, "idealplot900.txt", "r"); if (error != 0)exit(1); float a, b; while (fscanf_s(idealplots, "%f %f", &a, &b) != EOF) { idealX2[idealN] = a; idealY2[idealN++] = b; } fclose(idealplots); idealp = new XandY[idealN]; for (i = 0; i < idealN; i++) { idealp[i].X = idealX2[i]; idealp[i].Y = idealY2[i]; } delete[]idealX2; delete[]idealY2; i = atoi(argv[1]); sub(i); delete[]idealp; clock_t end = clock(); double time = static_cast<double>(end - start) / CLOCKS_PER_SEC * 1000.0; std::cerr << "time " << time << "[ms]" << std::endl; FILE* timefile; error = fopen_s(&timefile, "time900.txt", "a"); if (error != 0) { cerr<<"hirakenaiyo" << endl; exit(1); } fprintf_s(timefile, "%d %lf[ms]\n",i, time); fclose(timefile); }

narrow.txt

2 0 0 14.2857 2 0 1 25.2381 2 0 2 28.5714 2 1 3 11.1111 2 1 4 25 2 1 5 26.6667 2 1 6 24.6032 2 1 7 19.7279 2 1 8 13.6905 3 0 0 13.4372 3 0 1 22.4656 3 0 2 12.9101 3 1 2 13.4392 3 1 3 14.5437 3 1 4 16.4116 3 1 5 14.0794 3 1 6 10.9206 3 2 5 14.6667 3 2 6 20.9841 3 2 7 20.5896 3 2 8 19.1156 3 2 9 9.45767 4 0 0 14.0155 4 0 1 19.3528 4 0 2 5.78947 4 1 1 11.5706 4 1 2 15.9555 4 1 3 14.7691 4 1 4 12.2664 4 1 5 8.58145 4 2 4 11.1135 4 2 5 14.3496 4 2 6 15.1529 4 2 7 13.8811 4 2 8 11.6246 4 3 6 13.2519 4 3 7 15.7315 4 3 8 18.174 4 3 9 16.143 4 3 10 8.9317 5 0 0 13.2881 5 0 1 15.797 5 0 2 1.99109 5 1 1 11.5349 5 1 2 15.0971 5 1 3 12.3994 5 1 4 8.54756 5 2 3 10.8668 5 2 4 12.1216 5 2 5 12.6877 5 2 6 11.3595 5 3 5 9.23977 5 3 6 12.5661 5 3 7 14.4041 5 3 8 15.1326 5 4 7 10.4227 5 4 8 14.0041 5 4 9 19.1208 5 4 10 10.6284 6 0 0 13.0612 6 0 1 13.9921 6 0 2 0.855625 6 1 1 11.7508 6 1 2 14.4418 6 1 3 10.9452 6 1 4 6.58277 6 2 2 9.38247 6 2 3 12.3308 6 2 4 12.393 6 2 5 11.373 6 3 5 11.4095 6 3 6 12.8238 6 3 7 13.0548 6 3 8 9.25745 6 4 6 9.69116 6 4 7 13.3958 6 4 8 16.7378 6 4 9 10.0088 6 5 7 7.5188 6 5 8 11.1815 6 5 9 21.4457 6 5 10 12.5734 7 0 0 11.9524 7 0 1 11.8146 7 0 2 0.309949 7 1 1 11.0993 7 1 2 12.8282 7 1 3 8.98227 7 2 2 9.38487 7 2 3 12.1208 7 2 4 11.2091 7 3 4 9.81164 7 3 5 11.634 7 3 6 11.5848 7 4 6 11.0268 7 4 7 13.3855 7 4 8 11.3443 7 5 7 11.1073 7 5 8 15.7627 7 5 9 12.035 7 6 8 8.53855 7 6 9 21.4733 7 6 10 13.5937 8 0 0 11.8748 8 0 1 11.1489 8 0 2 0.171139 8 1 1 11.2207 8 1 2 12.4552 8 1 3 8.21331 8 2 2 9.82743 8 2 3 12.4804 8 2 4 10.8704 8 3 4 11.0748 8 3 5 12.167 8 3 6 10.6221 8 4 5 10.0111 8 4 6 12.4816 8 4 7 12.2177 8 5 6 9.46081 8 5 7 13.6089 8 5 8 13.095 8 6 7 10.0209 8 6 8 15.9181 8 6 9 14.3051 8 7 8 7.47689 8 7 9 23.2753 8 7 10 15.8664 9 0 0 10.9782 9 0 1 9.83347 9 1 1 10.4876 9 1 2 11.3391 9 2 3 11.8277 9 2 4 9.63389 9 3 4 11.1647 9 3 5 11.2654 9 4 5 10.8461 9 4 6 11.8703 9 5 6 10.9048 9 5 7 12.5434 9 6 7 12.4134 9 6 8 13.3493 9 7 8 15.1927 9 7 9 15.2623 9 8 9 23.9168 9 8 10 17.3464 10 0 0 10.9689 10 0 1 9.5866 10 1 1 10.5495 10 1 2 11.419 10 2 2 9.80679 10 2 3 12.1825 10 3 4 11.9707 10 3 5 10.2826 10 4 5 12.071 10 4 6 10.2624 10 5 6 12.2446 10 5 7 9.68535 10 6 6 9.23754 10 6 7 13.1566 10 7 7 11.6984 10 7 8 14.67 10 8 8 15.798 10 8 9 17.6764 10 9 9 26.639 10 9 10 21.0215 11 0 0 10.1769 11 1 2 10.5401 11 2 3 11.3947 11 3 4 11.3472 11 4 5 11.0763 11 5 6 10.4828 11 6 6 10.3868 11 7 7 12.171 11 8 8 14.9444 11 9 9 19.4291 11 10 10 24.7667 12 0 0 10.0976 12 1 1 10.0976 12 2 2 10.0976 12 3 3 10.0976 12 4 4 10.0976 12 5 5 10.0976 12 6 6 10.0976 12 7 7 10.0976 12 8 8 10.0976 12 9 9 10.0976 12 10 10 10.0976 12 11 11 10.0976

idealplot900.txt

-185.504992 -880.040129 -132.079213 -880.040129 -78.653433 -880.040129 以下同じようなものが計900個続く。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

hanamur

2022/07/27 01:57

一応、printf自体は110~130行目あたりに集中しています。
BeatStar

2022/07/27 03:06

文字化けしてるなら、その文字化けなものも提示してください。
dodox86

2022/07/27 03:18

> main.exe 2 >aaa.txt > とした場合はaaa.txtに文字化けが出力されます。 > main.exe 3 >aaa.txt > の場合は問題なく出力されます。 ソースコードの精査はしてませんが、コマンドラインオプションの引数(argv「1」)で変わるのなら、printfの問題ではなくてsub()関数含むプログラム自体の問題では。
fana

2022/07/27 03:48

> 質問の本筋と関係ない部分が多い上に長い と思うのであれば,問題が発生する最小のコードを用意して提示してください. (ふつーにやってればそんなことは起きないのであれば,その問題を起こすことができうる小さなコードを作る作業の過程で何か気づけることもあるでしょうし)
thkana

2022/07/27 12:22

「文字化け」という言葉の意味が私とあなたとで違っている気がします。 意図したものと「全く違う」数字でもアルファベットでもない(それらが混じっていることはあるが)、意味不明な表示が得られるものが文字化け、と私は理解しているのですが。
hanamur

2022/07/27 13:53 編集

dodox86さん >>.txtに出力ではなくコマンドプロンプト上に出力した場合は文字化けは起こらないのです。 fabnaさん >>main.cppの124行目のfor文の条件式のidealNを864に置き換えると文字化けして、863にすると文字化けが起こりませんでした。しかし読み込んだidealplot900.txtは確かに900行あり、問題は起こらないはずなのですが、、、(コマンドプロンプト上にはちゃんと出力される) thkanaさん >>1 1 0 6 778 767 760 756 756 760 768 779 783 761 742 726 714 707 703 703 707 715 727 743 762 ↑こういうものが出力されてほしいところ、↓こういうものが出力されてしまいます。 㐠㜴㐠㐸㔠㐲㔠㘶㘠〱㘠㔵㜠㄰㜠㠴㜠㌷㜠㌲㘠㐷㘠㘲㔠㤷㔠㌳㐠㤸㐠㘴㐠㜰㌠〷㌠㠳㌠㈱㈠㤸㈠㠵㈠㔳㈠㌲㈠㌲㈠㘳㈠㤵㈠ㄹ㌠㐱㌠〴㌠㈷㐠㤰㐠㤴㐠ㄹ㔠㘳㔠㈸㘠㤲㘠㜷㜠㘲㜠㔷㜠㔵㜠㐰㘠㐵㘠㐰㔠㔵㔠㜰㐠〶㐠㔱㌠ㄷ㌠ㄳ㈠㔹㈠㔶㈠㌴㈠㐱ㄠ㔸ㄠ〷ㄠ〷ㄠ㜸㈠㘱㈠㐴㈠㘶㈠㜹㌠㌳㌠㐷㐠 >>BeatStarさん 上のようなやつです。
yominet

2022/07/27 15:03

1.そのテキストを開いたアプリはなんですか? 別のテキストエディタ―でも同じことがおきますか?
hanamur

2022/07/27 16:46

テキストドキュメントです。 試しにcsvファイルに出力してみたところ、予定通りの数値が出力されていました。
thkana

2022/07/27 23:42

> 質問の本筋と関係ない部分が多い上に長いので読み飛ばしていただいて結構 質問の本筋と関係ない部分を削って症状のでる最小限のプログラムにするのは回答者の仕事ではなく質問者がやるべきことではないかと思いますがいかが?
FKD

2022/07/28 02:50

> 㐠㜴㐠㐸㔠~ UTF-16として文字コードを見ると、0x20(半角空白)と0x30~0x39(数字)で構成されているので、 表示アプリのエンコードの問題では? 「テキストドキュメント」が、なんなのか知らないですが、 メモ帳ならANSIかUTF-8なら意図通りになるかな? 参考: https://support.lenovo.com/co/ja/solutions/ht118905
hanamur

2022/07/28 17:38

FKDさん>>その通りでした。 解決しました。ありがとうございます。 文字化けの文字から推測するという方法も参考になります。 回答?
BeatStar

2022/07/28 23:58

@ 質問者さん 「自己解決」的なものがあるはずなので、そこに「何が原因で、どのように対応して解決したか」とかを書いてください。似たような問題に直面した人に向けてのアドバイスになるので。お願いします。
hanamur

2022/07/29 13:54

@BeatStarさん FKDさんの回答が自分にとって100%の回答だったのでこれをベストアンサーにしたいのですがここに書いてありますし、、、 回答してくださっているy_waiwaiさんの回答も今見ると当たっているわけで、これをさしおいて自己解決に書くというのもなんだか、、 という。。
BeatStar

2022/07/29 23:52 編集

ああ、そういう場合は「修正依頼の欄での○○さんのコメント通り、〜することで解決しました。具体的には...としました」的な感じでコメントした方のIDを提示すればいいと思いますよ。 私も似たような状況だとそういうふうにしてますし。
thkana

2022/07/30 03:48

そういう意味では、y_waiwaiさんのが事象としては当たりだったわけで、それをBAにして、 xxで開いたらダメだったけどooで開いたらOK、とかの今回の具体的事例としての情報を追記しておけばよいのでは。
hanamur

2022/07/31 04:43

BeatStarさん thkanaさん そのようにしました。ありがとうございます。
thkana

2022/07/31 05:34

>> xxで開いたらダメだったけどooで開いたらOK、とかの今回の具体的事例としての情報を追記しておけばよいのでは。 > そのようにしました そのようになっているとは思えないのですが... こういう公開の場に質問に出したということは、あなたの問題が解決するだけでなく、後で似たような疑問・トラブルをもってこの質問を検索する人の役に立つこともその意義になってくるわけです。なので、「これがダメな原因だった」というのを具体的に記しておくべきだと思うのですがちがうのでしょうか?
hanamur

2022/08/07 03:48

thkanaさん>> 原因は全く分かっておりません。
thkana

2022/08/07 22:51

では、せめて >>> xxで開いたらダメだったけどooで開いたらOK、とかの今回の具体的事例としての情報を追記しておけばよいのでは いま、あなたがわからなくても、将来、だれかにはわかるかも知れません。少なくとも、同じ状況で困っている人がいればその手順を踏めばいいわけで、救われます。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C++

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