提示コードのコメント部の内部ですがファイルの終端に到達したらEOFを返すことを利用してファイルを最後まで読むのですが無限ループしてしまいます。どうすればいいのでしょうか?リファレンスを見ましたが正しい処理のはずです。
自分のやりたい動作「 無限ループを使ってEOFで抜ける動作を作りファイルを最初から最後まで読む 」という動作を実現したいのですが現状
なぜかEOFでループが抜けず無限ループしてしまいます。(無限ループを抜けません。)
cpp
1 2//objファイルを読み込み 3bool Game::Load_obj(const char* file, std::vector<glm::vec3>& out_vertices, std::vector<glm::vec2>& out_uvs, std::vector<glm::vec3>& out_normals) 4{ 5 6 std::vector<unsigned int> vertexIndices; //頂点インデックス 7 std::vector<unsigned int> uvIndices; //UV座標インデックス 8 std::vector<unsigned int> normalIndices; //法線インデックス 9 std::vector<unsigned int> out_vertexIndices; 10 11 std::vector<glm::vec3> temp_vertices; 12 std::vector<glm::vec2> temp_uvs; 13 std::vector<glm::vec3> temp_normals; 14 15 FILE* fp = nullptr; 16 fopen_s(&fp, file, "r"); //読み込み専用でファイルを開く 17 18 /* 19 //.objファイルを表示 20 char str[256] = { 0 }; 21 if (fp != nullptr) { 22 while (fgets(str, 256, fp) != NULL) 23 { 24 printf("%s", str); 25 } 26 } 27 */ 28//////////////////////////////////////////////////////////////////////////////////////// 29 int a = 0; 30 if (fp != NULL) 31 { 32 while (true) 33 { 34 char lineHeader[256] = { 0 }; 35 int res = fscanf_s(fp, "%s",lineHeader, (unsigned int )strlen(lineHeader)); 36 printf("%d\n", &res); 37 38 if (res == EOF) 39 { 40 break; 41 } 42 else 43 { 44//////////////////////////////////////////////////////////////////////////////////// 45 //ファイル抽出 46 47 48 //頂点を抽出 49 if (strcmp(lineHeader, "v") == 0) 50 { 51 glm::vec3 vertex; 52 fscanf_s(fp, "%f %f %f", &vertex.x, &vertex.y, &vertex.z); 53 //out_vertices.push_back(vertex); 54 temp_vertices.push_back(vertex); 55 56 } 57 //UV座標を抽出 58 else if (strcmp(lineHeader, "vt") == 0) 59 { 60 glm::vec2 uv = glm::vec2(0, 0); 61 fscanf_s(fp, "%f %fn", &uv.x, &uv.y); 62 temp_uvs.push_back(uv); 63 } 64 //法線を抽出 65 else if (strcmp(lineHeader, "vn") == 0) 66 { 67 glm::vec3 normalize = glm::vec3(0, 0, 0); 68 fscanf_s(fp, "%f %f %fn", &normalize.x, &normalize.y, &normalize.z); 69 temp_normals.push_back(normalize); 70 } 71 else if (strcmp(lineHeader, "f") == 0) 72 { 73 // std::string vertex1, vertex2, vertex3; 74 unsigned int vertexIndex[3], uvIndex[3], normalIndex[3]; 75 76 int matches = fscanf_s(fp, "%d/%d/%d %d/%d/%d %d/%d/%d", 77 &vertexIndex[0], &vertexIndex[1], &vertexIndex[2], 78 &uvIndex[0], &uvIndex[1], &uvIndex[2], 79 &normalIndex[0], &normalIndex[1], &normalIndex[2]); 80 81 if (matches != 9) 82 { 83 printf("エラー\n"); 84 return false; 85 } 86 87 vertexIndices.push_back(vertexIndex[0]); 88 vertexIndices.push_back(vertexIndex[1]); 89 vertexIndices.push_back(vertexIndex[2]); 90 91 uvIndices.push_back(uvIndex[0]); 92 uvIndices.push_back(uvIndex[1]); 93 uvIndices.push_back(uvIndex[2]); 94 95 normalIndices.push_back(normalIndex[0]); 96 normalIndices.push_back(normalIndex[1]); 97 normalIndices.push_back(normalIndex[2]); 98 } 99 } 100 } 101 102 103 //頂点を設定 104 for (unsigned int i = 0; i < vertexIndices.size(); i++) 105 { 106 unsigned int vertexIndex = vertexIndices[i]; 107 glm::vec3 vertex = temp_vertices[vertexIndex - 1]; 108 out_vertices.push_back(vertex); 109 } 110 111 //UVを設定 112 for (unsigned int i = 0; i < uvIndices.size(); i++) 113 { 114 unsigned int uvIndex = uvIndices[i]; 115 glm::vec2 uv = temp_uvs[uvIndex - 1]; 116 out_uvs.push_back(uv); 117 } 118 119 //法線を設定 120 for (unsigned int i = 0; i < normalIndices.size(); i++) 121 { 122 unsigned int normalIndex = normalIndices[i]; 123 glm::vec3 normalize = temp_normals[normalIndex - 1]; 124 out_normals.push_back(normalize); 125 } 126 127 128 129// printf(".objファイル読み込み完了!\n"); 130 return true; 131 } 132 else 133 { 134 printf("ファイルが読めませんでした。\n"); 135 return false; 136 } 137}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。