いつもありがとうございます!
文字列操作が難しくて...
f d/d/d d/d/d d/d/d
f d//d d//d d//d
f d// d// d//
(頂点/テクスチャ/法線)
などいろんなパターンのデータに対応して
ファイルから取得したいです。
fscanf_s を使ってみましたが、
f d/d/d d/d/d d/d/d
の場合は大丈夫ですが、
f d//d d//d d//d
がうまくいきません...
ほかのやり方があれば教えてください!
回答よろしくお願いいたします。
objfile
1# Blender v2.79 (sub 0) OBJ File: '' 2# www.blender.org 3mtllib tesetobj.mtl 4o Cube 5v 1.000000 -1.000000 -1.000000 6v 1.000000 -1.000000 1.000000 7v -1.000000 -1.000000 1.000000 8v -1.000000 -1.000000 -1.000000 9v 1.000000 1.000000 -0.999999 10v 0.999999 1.000000 1.000001 11v -1.000000 1.000000 1.000000 12v -1.000000 1.000000 -1.000000 13vn 0.0000 -1.0000 0.0000 14vn 0.0000 1.0000 0.0000 15vn 1.0000 0.0000 0.0000 16vn -0.0000 -0.0000 1.0000 17vn -1.0000 -0.0000 -0.0000 18vn 0.0000 0.0000 -1.0000 19usemtl Material 20s off 21f 1//1 2//1 3//1 22f 5//2 8//2 7//2 23f 1//3 5//3 6//3 24f 2//4 6//4 7//4 25f 3//5 7//5 8//5 26f 5//6 1//6 4//6 27
if (strcmp(key, "f") == 0) { for (int i = 0; i < 3; i++) { Face[i].x = -1; Face[i].y = -1; Face[i].z = -1; } fscanf_s(fp, "%d/%d/%d %d/%d/%d %d/%d/%d", &Face[0].x, &Face[0].y,&Face[0].z, &Face[1].x , &Face[1].y , &Face[1].z, &Face[2].x, &Face[2].y, &Face[2].z); printf("%d,%d,%d\n", Face[0].x, Face[0].y, Face[0].z); printf("%d,%d,%d\n", Face[1].x, Face[1].y, Face[1].z); printf("%d,%d,%d\n", Face[2].x, Face[2].y, Face[2].z); }
main
1#include <stdio.h> 2#include <vector> 3#include<iostream> 4#include<Windows.h> 5using std::vector; 6 7struct Vector3f { 8 float x; 9 float y; 10 float z; 11}vec3d; 12 13struct Vector4l 14{ 15 int x; 16 int y; 17 int z; 18} vec4l; 19 20int main() 21{ 22 FILE *fp; 23 const char *file = "data.txt"; 24 char key[255] = { 0 }; 25 vector <Vector3f> Vertex; 26 Vector4l Face[3]; 27 28 29 fopen_s(&fp, file, "r"); 30 if (fp == NULL) 31 { 32 printf("%sのオープンに失敗しました。\n", file); 33 printf("Enterキーで終了。\n"); 34 getchar(); 35 return 0; 36 } 37 38 39 fseek(fp, SEEK_SET, 0); 40 41 while (!feof(fp)) 42 { 43 ZeroMemory(key, sizeof(key)); 44 fscanf_s(fp, "%s", key, sizeof(key)); 45 46 if (strcmp(key, "v") == 0) 47 { 48 fscanf_s(fp, "%f%f%f", &vec3d.x, &vec3d.y, &vec3d.z); 49 Vertex.push_back(vec3d); 50 } 51 52 if (strcmp(key, "f") == 0) 53 { 54 for (int i = 0; i < 3; i++) 55 { 56 Face[i].x = -1; 57 Face[i].y = -1; 58 Face[i].z = -1; 59 } 60 fscanf_s(fp, "%d/%d/%d %d/%d/%d %d/%d/%d", &Face[0].x, &Face[0].y,&Face[0].z, 61 &Face[1].x , &Face[1].y , &Face[1].z, 62 &Face[2].x, &Face[2].y, &Face[2].z); 63 printf("%d,%d,%d\n", Face[0].x, Face[0].y, Face[0].z); 64 printf("%d,%d,%d\n", Face[1].x, Face[1].y, Face[1].z); 65 printf("%d,%d,%d\n", Face[2].x, Face[2].y, Face[2].z); 66 } 67 } 68 69 fclose(fp); 70 71 getchar(); 72}
result
11,-858993460,-858993460 2-858993460,-858993460,-858993460 3-858993460,-858993460,-858993460 45,-858993460,-858993460 5-858993460,-858993460,-858993460 6-858993460,-858993460,-858993460 71,-858993460,-858993460 8-858993460,-858993460,-858993460 9-858993460,-858993460,-858993460 102,-858993460,-858993460 11-858993460,-858993460,-858993460 12-858993460,-858993460,-858993460 133,-858993460,-858993460 14-858993460,-858993460,-858993460 15-858993460,-858993460,-858993460 165,-858993460,-858993460 17-858993460,-858993460,-858993460 18-858993460,-858993460,-858993460
###追記
一行でやるとうまくいきますが、、
#include <stdio.h> #include <stdlib.h> #include <vector> #include<iostream> #include<Windows.h> #include <string.h> #include <string> using std::vector; using std::string; int main() { vector <int> Face; string str = "f 1//1 2//1 3//1"; str.erase(0, 2); while (!str.empty()) { int i = str.find_first_of("/ "); string head = str.substr(0, i); if (head == "") { Face.push_back(-1); } else { int num = atoi(head.c_str()); Face.push_back(num); } if (i == -1) { str.erase(0, 1); } else { str.erase(0, i + 1); } } for (int i = 0;i < Face.size();i++) { std::cout << Face[i] << std::endl; } getchar(); }
#####result
1 -1 1 2 -1 1 3 -1 1
#include <stdio.h> #include <stdlib.h> #include <vector> #include<iostream> #include<Windows.h> #include <string.h> #include <string> using std::vector; using std::string; int main() { FILE *fp; const char *file = "data.txt"; char key[255] = { 0 }; vector <int> Face; fopen_s(&fp, file, "r"); if (fp == NULL) { printf("%sのオープンに失敗しました。\n", file); printf("Enterキーで終了。\n"); getchar(); return 0; } fseek(fp, SEEK_SET, 0); while (!feof(fp)) { ZeroMemory(key, sizeof(key)); fgets(key, 255, fp); if (strncmp(key, "f", 1) == 0) { string str= key; str.erase(0, 2); while (!str.empty()) { int i = str.find_first_of("/ "); string head = str.substr(0, i); if (head == "") { Face.push_back(-1); } else { int num = atoi(head.c_str()); Face.push_back(num); } if (i == -1) { str.erase(0, 1); } else { str.erase(0, i + 1); } } } } for (int i = 0;i < Face.size();i++) { std::cout << Face[i] << std::endl; } fclose(fp); getchar(); }
#####result
1 -1 1 2 -1 1 3 -1 1 0 ←これ 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 2 -1 4 6 -1 4 7 -1 4 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 2 -1 4 6 -1 4 7 -1 4 0 3 -1 5 7 -1 5 8 -1 5 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 2 -1 4 6 -1 4 7 -1 4 0 3 -1 5 7 -1 5 8 -1 5 0 5 -1 6 1 -1 6 4 -1 6 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 2 -1 4 6 -1 4 7 -1 4 0 3 -1 5 7 -1 5 8 -1 5 0 5 -1 6 1 -1 6 4 -1 6 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 2 -1 4 6 -1 4 7 -1 4 0 3 -1 5 7 -1 5 8 -1 5 0 5 -1 6 1 -1 6 4 -1 6 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 2 -1 4 6 -1 4 7 -1 4 0 3 -1 5 7 -1 5 8 -1 5 0 5 -1 6 1 -1 6 4 -1 6 01 -1 1 2 -1 1 3 -1 1 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 2 -1 4 6 -1 4 7 -1 4 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 2 -1 4 6 -1 4 7 -1 4 0 3 -1 5 7 -1 5 8 -1 5 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 2 -1 4 6 -1 4 7 -1 4 0 3 -1 5 7 -1 5 8 -1 5 0 5 -1 6 1 -1 6 4 -1 6 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 2 -1 4 6 -1 4 7 -1 4 0 3 -1 5 7 -1 5 8 -1 5 0 5 -1 6 1 -1 6 4 -1 6 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 2 -1 4 6 -1 4 7 -1 4 0 3 -1 5 7 -1 5 8 -1 5 0 5 -1 6 1 -1 6 4 -1 6 0 1 -1 1 2 -1 1 3 -1 1 0 5 -1 2 8 -1 2 7 -1 2 0 1 -1 3 5 -1 3 6 -1 3 0 2 -1 4 6 -1 4 7 -1 4 0 3 -1 5 7 -1 5 8 -1 5 0 5 -1 6 1 -1 6 4 -1 6 0
###問題
・一行の後に 0 が入る
・同じ行が何度も表示
回答3件
あなたの回答
tips
プレビュー