🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

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

Q&A

解決済

2回答

2674閲覧

fscanf_s()関数でEOFが返ってこない理由とは?ファイルの終端に達したかをチェックする方法が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2020/12/31 00:53

編集2020/12/31 02:08

提示コードのコメント部の内部ですがファイルの終端に到達したらEOFを返すことを利用してファイルを最後まで読むのですが無限ループしてしまいます。どうすればいいのでしょうか?リファレンスを見ましたが正しい処理のはずです。
自分のやりたい動作「 無限ループを使ってEOFで抜ける動作を作りファイルを最初から最後まで読む 」という動作を実現したいのですが現状
なぜかEOFでループが抜けず無限ループしてしまいます。(無限ループを抜けません。)

公式リファレンス: https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/fscanf-s-fscanf-s-l-fwscanf-s-fwscanf-s-l?view=msvc-160

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}

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

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

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

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

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

guest

回答2

0

char lineHeader[256] = { 0 };
int res = fscanf_s(fp, "%s",lineHeader, (unsigned int )strlen(lineHeader));

fscanf_s に渡している strlen(lineHeader) は何を意図したものですか? 何を渡したいのですか?
lineHeaderの大きさ(サイズ)を渡したつもりなら、それはマチガイ。
stelen(lineHeader) の戻り値がいくつか調べた?

投稿2020/12/31 01:03

編集2020/12/31 01:06
episteme

総合スコア16612

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

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

0

ベストアンサー

char lineHeader[256] = { 0 };

int res = fscanf_s(fp, "%s",lineHeader, (unsigned int )strlen(lineHeader));

ここで、strlenを使うのは間違いです
strlen(lineHeader)の結果は0にしかなりません

投稿2020/12/31 02:18

y_waiwai

総合スコア88040

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

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

退会済みユーザー

退会済みユーザー

2020/12/31 02:29 編集

sizeof(lineHeader);にして見たのですがそれでもアクセスエラーが発生してしまいます。この場合どうすればいいのでしょうか? 追記 printf();デバックという行為を忘れていました。
y_waiwai

2020/12/31 02:31

int res = fscanf_s(fp, "%s",lineHeader, (unsigned int )sizeof(lineHeader)); ではだめですか?
退会済みユーザー

退会済みユーザー

2020/12/31 02:36

invalid vector subscript どうやらベクターで無効な添字と表示されているのでここではないということなのでベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問