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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Q&A

解決済

1回答

1006閲覧

sscanf_s()関数を使って.mtlファイルの文字を取り出す方法

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

0グッド

0クリップ

投稿2021/12/29 06:25

編集2021/12/29 06:26

提示コードですが///コメント部のコードでmap_kd文字列の次にる画像ファイルを名を読み込みたのですがprintf("str %s\n",str)で何も表示されませんこれは何が原因なのでしょうか?
下記のサンプルコードを参考に実装しました。

sscanf_s( tokenstring, "%s", s, (unsigned)_countof(s) );

参考サイト: https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/sscanf-s-sscanf-s-l-swscanf-s-swscanf-s-l?view=msvc-170

// ##################################### .mtlファイル読み込み ##################################### std::shared_ptr<std::vector<FrameWork::Material_File>> GetMaterial(const char* path) { std::vector<FrameWork::Material_File> material; material.resize(0); FILE *file; fopen_s(&file,path, "r"); bool b = false; if (file == NULL) { std::cerr << ".mtlファイルが開けません: " << path << std::endl; assert(0); } else { while (true) { char line[LINE_BUFFER] = { '\0' }; FrameWork::Material_File mtl; int res = fscanf_s(file, "%s", line, LINE_BUFFER); if (res == EOF) { break; } //newmtl Material.xxx if (strcmp(line, "newmtl") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[LINE_BUFFER] = { '\0' }; fscanf_s(file, "%s",str, LINE_BUFFER); strncpy_s(number , str + strlen("Material."),LINE_BUFFER); int num = atoi(number); // printf("newmtl Material.%d\n",num); mtl.materialNumber = num; if (b == true) { material.push_back(mtl); } if (b == false) { b = true; } } else if (strcmp(line, "Ns") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[LINE_BUFFER] = { '\0' }; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number, str + strlen("Ns"), LINE_BUFFER); float num = (float)atof(str); mtl.Ns = num; // printf("Ns %f\n", num); } else if (strcmp(line, "Ka") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[3][LINE_BUFFER] = { '\0' }; glm::vec3 n; fscanf_s(file, "%s", str,LINE_BUFFER); strncpy_s(number[0], str, LINE_BUFFER); n.x = (float)atof(number[0]); strncpy_s(number[1], str, LINE_BUFFER); n.y = (float)atof(number[1]); strncpy_s(number[2], str, LINE_BUFFER); n.z = (float)atof(number[2]); // printf("Ka %f %f %f \n",n.x,n.y,n.z); mtl.Ka = n; } else if (strcmp(line, "Kd") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[3][LINE_BUFFER] = { '\0' }; glm::vec3 n; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number[0], str, LINE_BUFFER); n.x = (float)atof(number[0]); strncpy_s(number[1], str, LINE_BUFFER); n.y = (float)atof(number[1]); strncpy_s(number[2], str, LINE_BUFFER); n.z = (float)atof(number[2]); // printf("Kd %f %f %f \n", n.x, n.y, n.z); mtl.Kd = n; } else if (strcmp(line, "Ks") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[3][LINE_BUFFER] = { '\0' }; glm::vec3 n; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number[0], str, LINE_BUFFER); n.x = (float)atof(number[0]); strncpy_s(number[1], str, LINE_BUFFER); n.y = (float)atof(number[1]); strncpy_s(number[2], str, LINE_BUFFER); n.z = (float)atof(number[2]); // printf("Ks %f %f %f \n", n.x, n.y, n.z); mtl.Ks = n; } else if (strcmp(line, "Ke") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[3][LINE_BUFFER] = { '\0' }; glm::vec3 n; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number[0], str, LINE_BUFFER); n.x = (float)atof(number[0]); strncpy_s(number[1], str, LINE_BUFFER); n.y = (float)atof(number[1]); strncpy_s(number[2], str, LINE_BUFFER); n.z = (float)atof(number[2]); // printf("Ke %f %f %f \n", n.x, n.y, n.z); mtl.Ke = n; } else if (strcmp(line, "Ni") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[LINE_BUFFER] = { '\0' }; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number, str + strlen("Ni"), LINE_BUFFER); float num = (float)atof(str); mtl.Ns = num; // printf("Ni %f\n", num); } else if (strcmp(line, "d") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[LINE_BUFFER] = { '\0' }; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number, str, LINE_BUFFER); float num = (float)atof(number); mtl.d = num; // printf("d %f\n", num); } else if (strcmp(line, "illum") == 0) { char str[LINE_BUFFER] = { '\0' }; char number[LINE_BUFFER] = { '\0' }; fscanf_s(file, "%s", str, LINE_BUFFER); strncpy_s(number, str, LINE_BUFFER); int num = atoi(number); mtl.illum = num; // printf("illum %d\n", num); } /////////////////////////////////////////////////////////////////////////////////////////////////// else if (strncmp(line, "map_Kd ",strlen("map_Kd ") - 1 ) == 0) { char str[LINE_BUFFER] = { '\0' }; char number[LINE_BUFFER] = { '\0' }; // fscanf_s(file, "%s", str, LINE_BUFFER); sscanf_s(line,"map_Kd %s",str, _countof(str)); printf("str %s\n",str); char string[500] = { '\0' }; GetFolderPath(path,string,500); printf("aaaaaa %s\n",string); strcat_s(string,500,str); printf("bbbbbb %s\n",string); //mtl.map_Kd = number; mtl.map_Kd = FrameWork::LoadTexture(string); //printf("map_Kd %s\n", mtl.map_Kd); } ///////////////////////////////////////////////////////////////////////////////////////////////// } } return std::make_shared<std::vector<FrameWork::Material_File>>(material); }
.mtlファイル
newmtl Material.019 Ns 225.000000 Ka 1.000000 1.000000 1.000000 Kd 0.800000 0.800000 0.800000 Ks 0.000000 0.000000 0.000000 Ke 0.000000 0.000000 0.000000 Ni 1.450000 d 1.000000 illum 1 map_Kd belts.png

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

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

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

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

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

episteme

2021/12/29 06:55

このコード、CじゃないC++だ。tagが違う。 それにC++なら fstreamとstring使った方が楽。
cx20

2021/12/29 07:19

たぶん、自分が前の回答で余計なことを書いた為に混乱させてしまったようですね。すみません。。 line という変数を見て、1行読み込んでいるのだと勘違いして回答してしまいました。 https://teratail.com/questions/375943#reply-508247 おそらく、ファイルの解析処理は ■ opengl-tutorials の objloader.cpp https://github.com/opengl-tutorials/ogl/blob/master/common/objloader.cpp を参考にして書かれているものと思います。 この処理だと 1行をヘッダ部とデータ部で分離して読み込むようにしているようです。 したがって、 > else if (strncmp(line, "map_Kd ",strlen("map_Kd ") - 1 ) == 0) ここも、他と同様に strcmp() で大丈夫そうです。
退会済みユーザー

退会済みユーザー

2021/12/29 08:27

cx20 さんわかりました。大丈夫です。
episteme

2021/12/29 09:52

で、僕の回答にはコメントのひとつもないのか? ベストアンサーは社交辞令か?
guest

回答1

0

ベストアンサー

int res = fscanf_s(file, "%s", line, LINE_BUFFER);

これでファイルに書かれた一行(先頭から改行まで)がlineに読み込まれていますか?
その直後に printf("[%s]\n", line); でも書いて確認しましたか? (してませんよね)
※ あるいはデバッガ上で動かしてlineの値を見てればわかる

投稿2021/12/29 06:50

編集2021/12/29 06:57
episteme

総合スコア16612

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

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

退会済みユーザー

退会済みユーザー

2021/12/29 10:23

なるほど。printfした結果。一行づつなので空白も次の行に行ってしまうのでそこを忘れていました。
episteme

2021/12/29 11:42

一行づつ読んでなかったんじゃないの? ホントに「なるほど」なの?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問