ファイルから特定の値を読み取り変数のアドレス先に格納し、その値を違う変数のアドレス先に格納したいのですが、色々試したのですが、考えたような結果になりません。
ネットでも調べてみたのですが、これといった情報がなかったので、質問させていただきました。
c++
1 while (fgets(buf, 25, pFileObj) != NULL) { 2 buf2 = buf; 3 if (*buf2 == 'v') { 4 if (*(++buf2) != 'n' && *(buf2)!='t') { 5 sscanf(buf2, "%s %f %f %f", 6 chr, 7 &vertex[vertexDataSize * 3], 8 &vertex[vertexDataSize * 3 + 1], 9 &vertex[vertexDataSize * 3 + 2]); 10 11 vertexDataSize++; 12 } 13 } 14 else if (*buf2 == 'f') { 15 sscanf(buf2, "%s %d/%d/%d %d/%d/%d %d/%d/%d", 16 chr, 17 &i1, 18 &i2, 19 &i3, 20 21 &i4, 22 &i5, 23 &i6, 24 25 &i7, 26 &i8, 27 &i9); 28 29 iptr1 = &lines[vertexDataSize * 3]; 30 iptr2 = &lines[vertexDataSize * 3 + 1]; 31 iptr3 = &lines[vertexDataSize * 3 + 2]; 32 33 i1 = i1 - 1; 34 i4 = i4 - 1; 35 i7 = i7 - 1; 36 37 38 iptr4 = &i1; 39 iptr5 = &i4; 40 iptr6 = &i7; 41 42 *iptr1 = *iptr4; 43 *iptr2 = *iptr5; 44 *iptr3 = *iptr6; 45 46 47 lineDataSize++; 48 } 49 50 51 }
上のソースコードで、else if (*buf2 == 'f')から始まる部分が分からないのですが、
上の写真の一行目なら、f 5/1/1 3/2/1 1/3/1 だと思うのですが、
この 5/1/1の5と、3/2/1の3と、1/3/1の1を-1してlinesのアドレス先に格納したい(格納する値4 2 0)のですが、どのようにすればいいのでしょうか?
お手数をおかけしますがどなたかわかる方教えてください。<(_ _)>
追記です。
c++
1void loadOBJ() 2{ 3 FILE* pFileObj, * pFileMtl; 4 5 fopen_s(&pFileMtl, "OBJファイル//NewblockF.txt", "r"); 6 fopen_s(&pFileObj, "OBJファイル//ねずこ.txt", "r"); 7 8 if((pFileObj == nullptr) || (pFileMtl == nullptr)) { 9 printf("file erro\n"); 10 return; 11 } 12 printf("opennd file\n"); 13 14 char chr[25]; 15 int i1, i2, i3,i4,i5,i6,i7,i8,i9; 16 char buf[25]; 17 18 while (fgets(buf, 25, pFileObj) != NULL) { 19 char* buf2 = buf; 20 if (*buf2 == 'v') { 21 if ((*(++buf2) != 'n') && (*buf2 !='t')) { 22 sscanf(buf, "%s %f %f %f", 23 chr, 24 &vertex[vertexDataSize * 3], 25 &vertex[vertexDataSize * 3 + 1], 26 &vertex[vertexDataSize * 3 + 2]); 27 28 vertexDataSize++; 29 } 30 } 31 else if (*buf2 == 'f') { 32 sscanf(buf, "%s %d/%d/%d %d/%d/%d %d/%d/%d", 33 chr, 34 &i1, 35 &i2, 36 &i3, 37 38 &i4, 39 &i5, 40 &i6, 41 42 &i7, 43 &i8, 44 &i9); 45 /**/ 46 int* iptr1 = &lines[lineDataSize * 3]; 47 int* iptr2 = &lines[lineDataSize * 3 + 1]; 48 int* iptr3 = &lines[lineDataSize * 3 + 2]; 49 50 i1 = i1 - 1; 51 i4 = i4 - 1; 52 i7 = i7 - 1; 53 54 55 int* iptr4 = &i1; 56 int* iptr5 = &i4; 57 int* iptr6 = &i7; 58 59 *iptr1 = *iptr4; 60 *iptr2 = *iptr5; 61 *iptr3 = *iptr6; 62 63 64 lineDataSize++; 65 } 66 67 68 }
多くの情報をいただき、このようにしてみたのですが、少ないテキスト文字を読み取る(4角形ブロック)とうまくいくのですが、多くの文字を読み込む(人間モデル)だと失敗してしまうのはなぜでしょうか?
for (int i = 0; i < vertexDataSize; i++) { printf("%f %f %f\n", vertex[i * 3], vertex[i * 3 + 1], vertex[i * 3 + 2]); } for (int i = 0; i < lineDataSize; i++) { printf("%d %d %d\n", lines[i * 3], lines[i * 3 + 1], lines[i * 3 + 2]); }
このソースコードを最後に書いて実行してみると、このように描画され、配列に格納されている値も正常に格納されています。
ですが、このオブジェを人間モデルに変えて実行すると、
まず、読み込まれた値が、一番最初から、-nan 0.000000 0.000000 と訳の分からない値が読み込まれていて、それが終わったと思ったら、テキストの値とは全く異なった値が、読み込まれてしまいました。
そして、
for (int i = 0; i < lineDataSize; i++) { printf("%d %d %d\n", lines[i * 3], lines[i * 3 + 1], lines[i * 3 + 2]); }
これだけにすると、値が描画されず、おそらく、先ほどの右ウィンドウに描画されていた値は、
if (*buf2 == 'v')の部分で読み取っている値だと思うのですが、そのあとのelse if (*buf2 == 'f')が
動作していないようです。
色々考えてはみたのですが、うまくいかなかったので、お手数をおかけしますがどなたかわかる方教えてください<(_ _)>。
回答4件
あなたの回答
tips
プレビュー