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

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

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

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

Q&A

解決済

1回答

2631閲覧

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

hanamur

総合スコア45

C++

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

0グッド

0クリップ

投稿2022/07/27 01:54

編集2022/07/27 02:44

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

main.cpp

1#include <iostream> 2#include <stdio.h> 3#include <stdlib.h> 4#include<string.h> 5#include<time.h> 6#include <algorithm> 7#define _USE_MATH_DEFINES 8#include <math.h> 9#define atomOSD 50 10#define banedOSD 300 11#define outerOSDnum 9 12#define baseOSD 25 13#define halfOSD 12.5 14 15using namespace std; 16 17typedef struct { 18 int i1[12]; 19} str1; 20 21typedef struct { 22 float X; 23 float Y; 24} XandY; 25 26typedef struct { 27 float katamuki; 28 float seppen; 29} PathParam; 30 31XandY* idealp; 32int idealN; 33str1* strc2; 34str1* strc3; 35int* strc1; 36//FILE* preDISTANCE; 37float* taiou; 38int m; 39 40void subsubsub(int preFOSDnum, int preSOSDnum, int preFnum, int preSnum) { 41 int Fnum = preFnum * 6; 42 int Snum = preSnum * 6; 43 int ALLN = Fnum + Snum; 44 float FOSD = taiou[preFOSDnum]; 45 float SOSD = taiou[preSOSDnum]; 46 int i, j, k, n; 47 long long l; 48 double epsilon = 1e-5; 49 float x, y; 50 int nantonaku = 900; 51 52 float FRADs = 2 * M_PI / Fnum; 53 float SRADs = 2 * M_PI / Snum; 54 PathParam* PP; 55 PP = new PathParam[ALLN]; 56 k = 0; 57 l = FOSD / 500; 58 for (j = 0; j < Fnum; j++) { 59 if (fabs(cos(FRADs * j + l * M_PI / 2)) > epsilon) { 60 PP[k].katamuki = tan(FRADs * j + l * M_PI / 2); 61 PP[k++].seppen = -FOSD / cos(FRADs * j + l * M_PI / 2); 62 } 63 else { 64 PP[k].katamuki = INFINITY; 65 PP[k++].seppen = FOSD / sin(FRADs * j + l * M_PI / 2); 66 } 67 } 68 l = SOSD / 500; 69 for (j = 0; j < Snum; j++) { 70 if (fabs(cos(SRADs * j + l * M_PI / 2)) > epsilon) { 71 PP[k].katamuki = tan(SRADs * j + l * M_PI / 2); 72 PP[k++].seppen = -SOSD / cos(SRADs * j + l * M_PI / 2); 73 } 74 else { 75 PP[k].katamuki = INFINITY; 76 PP[k++].seppen = SOSD / sin(SRADs * j + l * M_PI / 2); 77 } 78 } 79 XandY* IS; 80 IS = new XandY[ALLN * ALLN]; 81 k = 0; 82 for (i = 0; i < ALLN - 1; i++) { 83 for (j = i + 1; j < ALLN; j++) { 84 if (isinf(PP[i].katamuki) && isinf(PP[j].katamuki)); 85 else if (fabs(PP[i].katamuki - PP[j].katamuki) < epsilon); 86 else if (isinf(PP[i].katamuki)) { 87 x = PP[i].seppen; 88 y = PP[j].katamuki * x + PP[j].seppen; 89 if (x * x + y * y < 810000) { 90 IS[k].X = x; 91 IS[k++].Y = y; 92 } 93 } 94 else if (isinf(PP[j].katamuki)) { 95 x = PP[j].seppen; 96 y = PP[i].katamuki * x + PP[i].seppen; 97 if (x * x + y * y < 810000) { 98 IS[k].X = x; 99 IS[k++].Y = y; 100 } 101 } 102 else { 103 x = (PP[j].seppen - PP[i].seppen) / (PP[i].katamuki - PP[j].katamuki); 104 y = PP[i].katamuki * x + PP[i].seppen; 105 if (x * x + y * y < 810000) { 106 IS[k].X = x; 107 IS[k++].Y = y; 108 } 109 } 110 } 111 } 112 113 printf("%d %d %d %d ", preFnum, preSnum, preFOSDnum, preSOSDnum); 114 if (k == 0) { 115 for (i = 0; i < idealN; i++)printf("%d ", 900); 116 printf("\n"); 117 std::cerr << "yatta-" << std::endl; 118 } 119 else { 120 for (i = 0; i < idealN; i++) { 121 n = nantonaku * nantonaku - 1; 122 for (j = 0; j < k; j++) { 123 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); 124 if (l < n)n = l; 125 } 126 n = sqrt(n); 127 printf("%d ", n + 1); 128 } 129 printf("\n"); 130 } 131 delete[] IS; 132 delete[] PP; 133} 134 135void subsub(int preFOSDnum, int preSOSDnum, int num) 136{ 137 int i, j; 138 for (i = 1; i < 24 - num; i++) { 139 for (j = 1; j < 25 - num - i; j++) { 140 subsubsub(preFOSDnum, preSOSDnum,i, j); 141 cerr << preFOSDnum << " " << preSOSDnum << " " << i << " " << j << " " << m++ << endl; 142 } 143 } 144} 145 146void sub(int num) { 147 148 FILE* narrow; 149 errno_t error = fopen_s(&narrow, "narrow.txt", "r"); 150 if (error != 0)exit(1); 151 int a0, a1, a2; 152 float a3; 153 strc1 = new int[13]; 154 strc2 = new str1[12]; 155 strc3 = new str1[12]; 156 memset(strc1, 0, sizeof(int) * 13); 157 memset(strc2, 0, sizeof(str1) * 12); 158 memset(strc3, 0, sizeof(str1) * 12); 159 while (fscanf_s(narrow, "%d %d %d %f", &a0, &a1, &a2, &a3) != EOF) { 160 if (a0 == num) { 161 strc1[a1 + 1]++; 162 strc2[a1].i1[a2]++; 163 } 164 } 165 fclose(narrow); 166 int i, j, k, l; 167 for (i = 1; i < num + 1; i++) { 168 strc1[i] += strc1[i - 1]; 169 } 170 taiou = new float[strc1[i - 1] * 2]; 171 for (i = 0; i < 12; i++) { 172 k = 0; 173 for (j = 0; j < 12; j++) { 174 if (strc2[i].i1[j] == 1)strc3[i].i1[k++] = j; 175 } 176 } 177 k = 0; 178 for (i = 0; i < num; i++) { 179 for (j = 0; j < strc1[i + 1] - strc1[i]; j++) { 180 l = strc3[i].i1[j] / outerOSDnum; 181 taiou[k++] = strc3[i].i1[j] * atomOSD + l * banedOSD + baseOSD - halfOSD; 182 taiou[k++] = strc3[i].i1[j] * atomOSD + l * banedOSD + baseOSD + halfOSD; 183 } 184 } 185 for (i = 1; i < num + 1; i++)strc1[i] *= 2; 186 for (i = 1; i < num + 1; i++)printf("%d\n", strc1[i]); 187 for (i = 0; i < num - 1; i++) { 188 for (j = strc1[i]; j < strc1[i + 1]; j++) { 189 for (k = i + 1; k < num; k++) { 190 for (l = strc1[k]; l < strc1[k + 1]; l++) { 191 subsub(j,l,num); 192 } 193 } 194 } 195 } 196 delete[]strc1; 197 delete[]strc2; 198 delete[]strc3; 199 delete[]taiou; 200} 201 202int main(int argc, char* argv[]) { 203 clock_t start = clock(); 204 m = 0; 205 int i; 206 idealN = 0; 207 float* idealX2, * idealY2; 208 idealX2 = new float[131 * 131]; 209 idealY2 = new float[131 * 131]; 210 FILE* idealplots; 211 errno_t error; 212 error = fopen_s(&idealplots, "idealplot900.txt", "r"); 213 if (error != 0)exit(1); 214 215 float a, b; 216 while (fscanf_s(idealplots, "%f %f", &a, &b) != EOF) { 217 idealX2[idealN] = a; 218 idealY2[idealN++] = b; 219 } 220 fclose(idealplots); 221 idealp = new XandY[idealN]; 222 for (i = 0; i < idealN; i++) { 223 idealp[i].X = idealX2[i]; 224 idealp[i].Y = idealY2[i]; 225 } 226 delete[]idealX2; 227 delete[]idealY2; 228 i = atoi(argv[1]); 229 sub(i); 230 delete[]idealp; 231 clock_t end = clock(); 232 233 double time = static_cast<double>(end - start) / CLOCKS_PER_SEC * 1000.0; 234 std::cerr << "time " << time << "[ms]" << std::endl; 235 FILE* timefile; 236 error = fopen_s(&timefile, "time900.txt", "a"); 237 if (error != 0) { 238 cerr<<"hirakenaiyo" << endl; 239 exit(1); 240 } 241 fprintf_s(timefile, "%d %lf[ms]\n",i, time); 242 fclose(timefile); 243}

narrow.txt

12 0 0 14.2857 22 0 1 25.2381 32 0 2 28.5714 42 1 3 11.1111 52 1 4 25 62 1 5 26.6667 72 1 6 24.6032 82 1 7 19.7279 92 1 8 13.6905 103 0 0 13.4372 113 0 1 22.4656 123 0 2 12.9101 133 1 2 13.4392 143 1 3 14.5437 153 1 4 16.4116 163 1 5 14.0794 173 1 6 10.9206 183 2 5 14.6667 193 2 6 20.9841 203 2 7 20.5896 213 2 8 19.1156 223 2 9 9.45767 234 0 0 14.0155 244 0 1 19.3528 254 0 2 5.78947 264 1 1 11.5706 274 1 2 15.9555 284 1 3 14.7691 294 1 4 12.2664 304 1 5 8.58145 314 2 4 11.1135 324 2 5 14.3496 334 2 6 15.1529 344 2 7 13.8811 354 2 8 11.6246 364 3 6 13.2519 374 3 7 15.7315 384 3 8 18.174 394 3 9 16.143 404 3 10 8.9317 415 0 0 13.2881 425 0 1 15.797 435 0 2 1.99109 445 1 1 11.5349 455 1 2 15.0971 465 1 3 12.3994 475 1 4 8.54756 485 2 3 10.8668 495 2 4 12.1216 505 2 5 12.6877 515 2 6 11.3595 525 3 5 9.23977 535 3 6 12.5661 545 3 7 14.4041 555 3 8 15.1326 565 4 7 10.4227 575 4 8 14.0041 585 4 9 19.1208 595 4 10 10.6284 606 0 0 13.0612 616 0 1 13.9921 626 0 2 0.855625 636 1 1 11.7508 646 1 2 14.4418 656 1 3 10.9452 666 1 4 6.58277 676 2 2 9.38247 686 2 3 12.3308 696 2 4 12.393 706 2 5 11.373 716 3 5 11.4095 726 3 6 12.8238 736 3 7 13.0548 746 3 8 9.25745 756 4 6 9.69116 766 4 7 13.3958 776 4 8 16.7378 786 4 9 10.0088 796 5 7 7.5188 806 5 8 11.1815 816 5 9 21.4457 826 5 10 12.5734 837 0 0 11.9524 847 0 1 11.8146 857 0 2 0.309949 867 1 1 11.0993 877 1 2 12.8282 887 1 3 8.98227 897 2 2 9.38487 907 2 3 12.1208 917 2 4 11.2091 927 3 4 9.81164 937 3 5 11.634 947 3 6 11.5848 957 4 6 11.0268 967 4 7 13.3855 977 4 8 11.3443 987 5 7 11.1073 997 5 8 15.7627 1007 5 9 12.035 1017 6 8 8.53855 1027 6 9 21.4733 1037 6 10 13.5937 1048 0 0 11.8748 1058 0 1 11.1489 1068 0 2 0.171139 1078 1 1 11.2207 1088 1 2 12.4552 1098 1 3 8.21331 1108 2 2 9.82743 1118 2 3 12.4804 1128 2 4 10.8704 1138 3 4 11.0748 1148 3 5 12.167 1158 3 6 10.6221 1168 4 5 10.0111 1178 4 6 12.4816 1188 4 7 12.2177 1198 5 6 9.46081 1208 5 7 13.6089 1218 5 8 13.095 1228 6 7 10.0209 1238 6 8 15.9181 1248 6 9 14.3051 1258 7 8 7.47689 1268 7 9 23.2753 1278 7 10 15.8664 1289 0 0 10.9782 1299 0 1 9.83347 1309 1 1 10.4876 1319 1 2 11.3391 1329 2 3 11.8277 1339 2 4 9.63389 1349 3 4 11.1647 1359 3 5 11.2654 1369 4 5 10.8461 1379 4 6 11.8703 1389 5 6 10.9048 1399 5 7 12.5434 1409 6 7 12.4134 1419 6 8 13.3493 1429 7 8 15.1927 1439 7 9 15.2623 1449 8 9 23.9168 1459 8 10 17.3464 14610 0 0 10.9689 14710 0 1 9.5866 14810 1 1 10.5495 14910 1 2 11.419 15010 2 2 9.80679 15110 2 3 12.1825 15210 3 4 11.9707 15310 3 5 10.2826 15410 4 5 12.071 15510 4 6 10.2624 15610 5 6 12.2446 15710 5 7 9.68535 15810 6 6 9.23754 15910 6 7 13.1566 16010 7 7 11.6984 16110 7 8 14.67 16210 8 8 15.798 16310 8 9 17.6764 16410 9 9 26.639 16510 9 10 21.0215 16611 0 0 10.1769 16711 1 2 10.5401 16811 2 3 11.3947 16911 3 4 11.3472 17011 4 5 11.0763 17111 5 6 10.4828 17211 6 6 10.3868 17311 7 7 12.171 17411 8 8 14.9444 17511 9 9 19.4291 17611 10 10 24.7667 17712 0 0 10.0976 17812 1 1 10.0976 17912 2 2 10.0976 18012 3 3 10.0976 18112 4 4 10.0976 18212 5 5 10.0976 18312 6 6 10.0976 18412 7 7 10.0976 18512 8 8 10.0976 18612 9 9 10.0976 18712 10 10 10.0976 18812 11 11 10.0976

idealplot900.txt

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

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

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

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

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

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

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

回答1

0

ベストアンサー

出力したファイルが文字化けする、ということなら、そのファイルを開くアプリ(テキストエディタ)の文字コード設定があってないってだけでは。

投稿2022/07/27 02:06

編集2022/07/27 02:07
y_waiwai

総合スコア87784

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

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

Zuishin

2022/07/27 02:28

その理由で %d が化けるんですか?
hanamur

2022/07/31 04:41

↑の方の質問への追記・修正というところでFKDさんという方の提示された手順で操作することで解決しました。 回答してくれた皆さんありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問