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

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

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

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

C++

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

Q&A

解決済

2回答

2058閲覧

fopen_s使い方(配列に格納した文字列での開き方)

hikarhikar

総合スコア18

C

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

C++

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

0グッド

0クリップ

投稿2020/04/11 07:13

編集2020/04/11 12:45

Xファイル内に記載されているファイル名を配列に格納し、それを基にfopen_sでファイルを開きたいのですが、ファイルエラーになってしまって、ネットでも調べてみても分からなかったので、質問させていただきました。

Xファイル
↑Xファイル

erro:22はネットで調べた結果、[無効な式数]ということでした。
結果
プロジェクトファイル
直接配列内に描画結果で出たファイル名を格納した場合は正常にファイルを開くことができました。

C++

1char filename[18][BUF_MAX] = { 2 "Amiku1.bmp", 3 "sepangmiku_skin.bmp", 4 "Amiku1.bmp", 5 "Amiku1.bmp", 6 "Amiku1.bmp", 7 "Amiku2.bmp", 8 "Amiku1.bmp", 9 "Amiku2.bmp", 10 "2ddream.bmp", 11 "2ddream.bmp", 12 "2ddream.bmp", 13 "2ddream.bmp", 14 "01.bmp", 15 "2ddream.bmp", 16 "2ddream.bmp" 17};

C++

1#include <stdio.h> 2#include <stdlib.h> 3 4#include "glut.h" 5#include "glm/glm.hpp" 6 7#include "drawObj.h" 8 9int txtcount = 0; 10char FileCommand[FILE_MAX][BUF_MAX] = { 0 }; 11char FileName[FILE_MAX][BUF_MAX] = { 0 }; 12char ReadFile[FILE_MAX][BUF_MAX] = { 0 }; 13 14void drawBegin(glm::ivec2 _windowSize) { 15 glPushMatrix(); 16 glMatrixMode(GL_PROJECTION); 17 glLoadIdentity(); 18 19 gluPerspective(30.0, (double)_windowSize.x / _windowSize.y, 1.0, 100.0); 20 21 glMatrixMode(GL_MODELVIEW); 22 glLoadIdentity(); 23} 24 25void loadObj() { 26 FILE* fobj; 27 fopen_s(&fobj, "OBJ//mikuobjx.txt", "r"); 28 if (fobj == nullptr) { 29 printf("file erro\n"); 30 return; 31 } 32 printf("openned file\n"); 33 34 int fCndCont = 0; 35 bool fileNameCount = false; 36 37 char buf[BUF_MAX] = { 0 }; 38 while (fgets(buf, BUF_MAX, fobj) != NULL) { 39 char* subBuf = buf; 40 41 /*------------------------------------------------------テクスチャ名取得------------------------------------------------------*/ 42 //GetFileCommand 43 if (strstr(buf, "Material ") != NULL) { 44 int i = 0; 45 for (; *subBuf != 0x7b; subBuf++) { 46 if (*subBuf == 0x20) { 47 subBuf++; 48 for (; *subBuf != 0x20; subBuf++) { 49 FileCommand[fCndCont][i] = *subBuf; 50 i++; 51 } 52 break; 53 } 54 } 55 //printf("%d:%s\n", fCndCont, FileCommand[fCndCont]); 56 fCndCont++; 57 } 58 59 //GetFileName 60 if (strstr(buf, "TextureFilename") != NULL) { 61 fileNameCount = true; 62 continue; 63 } 64 if (fileNameCount == true) { 65 int i = 0; 66 for (; *subBuf != 0x3b; subBuf++) { 67 if (*subBuf == 0x22) { 68 for (; *subBuf != 0x3b; subBuf++) { 69 FileName[fCndCont-1][i] = *subBuf; 70 i++; 71 } 72 break; 73 } 74 } 75 fileNameCount = false; 76 } 77 } 78 /*for (int i = 0; i < fCndCont; i++) { 79 printf("%s:%s\n", FileCommand[i], FileName[i]); 80 }*/ 81 82 int first = 0; 83 int count = 0; 84 bool filecont = true; 85 86 for (int i = 0; i < fCndCont; i++) { 87 for (int k = 0; k < fCndCont; k++) { 88 first = 0; 89 for (; FileName[k][first] != NULL; first++) { 90 if (FileName[i][first] == ReadFile[k][first]) 91 count++; 92 } 93 if (first == 0) { 94 continue; 95 } 96 if (count == first) { 97 filecont = false; 98 } 99 count = 0; 100 } 101 if (filecont == true) { 102 for (int m = 0; FileName[i][m]!=NULL; m++) { 103 ReadFile[txtcount][m] = FileName[i][m]; 104 } 105 txtcount++; 106 } 107 filecont = true; 108 } 109 //printf("txtcount:%d\n", txtcount); 110 /*for (int i = 0; i < txtcount; i++) { 111 printf("ReadFile %d:%s\n",i, ReadFile[i]); 112 }*/ 113 114 fclose(fobj); 115} 116 117void loadTxt() { 118 for (int i = 0; i < txtcount; i++) { 119 printf("ReadFile %d:%s\n", i, ReadFile[i]); 120 FILE* ftxt; 121 errno_t erro; 122 erro = fopen_s(&ftxt, ReadFile[0], "rb"); 123 if (ftxt == nullptr) { 124 printf("file erro\n"); 125 printf("erro:%d\n", erro); 126 continue; 127 } 128 printf("openned file\n"); 129 130 fclose(ftxt); 131 } 132}

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

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

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

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

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

guest

回答2

0

ベストアンサー

直接の回答ではありません。

エラーとなっているのは、

fopen_s(&ftxt, FileName[0], "rb");

でしょうか? で、 printf("file erro\n");でエラーが表示されるということ?
これだけだと情報不足です。
せめて、エラーとなったファイル名くらい表示させましょう。 (printf("file error: %s\n", FileName[0]); とか)
で、そのファイル名が正しいのか、まず確認。 次はそのファイルがアクセス可能なのか? そのへんからではないでしょうか?
また、fopen_s()は、戻り値があるので、その戻り値を見れば、なんのエラーか分かります。

投稿2020/04/11 07:52

pepperleaf

総合スコア6385

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

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

hikarhikar

2020/04/11 13:02 編集

pepperleafさんご返信ありがとうございます。 情報不足申し訳ありませんでした。<(_ _)> 再度編集させていただきました。 エラーの場所はpepperleafさんのおっしゃった通りの場所で、エラーとなったファイルは "Amiku1.bmp" "sepangmiku_skin.bmp" "Amiku2.bmp" "2ddream.bmp" "01.bmp" この通り全てです。 エラー内容は22で「無効な引数」とのことでした。 ですが、[printf]で配列内のファイル名を描画して、上に書いたように描画されたファイル名をそのままコピー&ペーストし直接配列に格納した場合は正常に開けました。 なので、fgetsで読み込んだファイル名を配列に格納した際に、何か違う値になってしまったのかもしれないと思ったのですが、色々試したのが分かりませんでした。 どのようにすればいいのでしょうか?
episteme

2020/04/12 00:32

それらファイルのあるディレクトリで実行すればファイルオープンできますか? OBJ\XXXX.bmp をオープンしたいなら fopen_s では "OBJ\XXXX.bmp" を引数にせにゃいかんですが。
hikarhikar

2020/04/12 03:53

epistemeさんご返信ありがとうございます。<(_ _)> ファイルの場所は[OBJファイル]の場所ではなく、プロジェクトと同じ場所に置かれています。 ReadFile内の文字列を描画すると、 "Amiku1.bmp" :"sepangmiku_skin.bmp" "Amiku2.bmp" "2ddream.bmp" "01.bmp" このように描画され、描画された内容をコピー&ペーストで、配列に直接格納すると char filebuf[FILE_MAX][BUF_MAX] = { {"Amiku1.bmp"}, {"sepangmiku_skin.bmp"}, {"Amiku2.bmp"}, {"2ddream.bmp"}, {"01.bmp"}, }; (このようなかんじです。) ファイルが正常に開けました。 ファイルエラー22は無効な引数とのことだったのですが、どうしたらいいのでしょうか?
episteme

2020/04/12 04:01

erro = fopen_s(&ftxt, ReadFile[0], "rb"); の直前で printf("[%s]\n",ReadFile[0]); してみて。 それが"本当に"オープンしたいファイル名と完全一致しますか? そうであるならファイルエラーにはならんはず
hikarhikar

2020/04/12 05:00

epistemeさんご返信ありがとうございます<(_ _)> オープンしたいファイル名と一致すると思うのですが、エラーが出てしまいます。 エラー配列と直接配列に描画内容を格納した配列の結果を張らせていただきます。 ん~何が原因なのかわかりません..... エラーが出てしまう配列 https://drive.google.com/open?id=1aK3joCkIkw0kLp0vQZi--JHWKDHEq9PR 描画した内容をコピペした配列 https://drive.google.com/open?id=1vYHjcaXEAvksdsn0wvPPfZIeflfc5SBe
hikarhikar

2020/04/12 05:06

あっ、ファイルを見比べ眺めていたら、ReadFileとfilebufのファイル名に 正常に実行されたファイル名には[" ”]がないのに対し、失敗したReadFileには[" "]がはいってしまっています。[" "]をReadFileに入れないようにソースコードを調整して試してきます。<(_ _)>
hikarhikar

2020/04/12 05:13

ファイルを開くことができました。 助かりました。ありがとうございます(*´▽`*) そこで、[""]についてなのですが、この[" "](0x22)は何のためにかくのでしょうか? char型変数に格納するためのコマンド? なぜ、配列にファイル名を格納した際(ReadFile)には[" "]はいらなかったのでしょうか? もしよければ、教えてください<(_ _)>
episteme

2020/04/12 05:55 編集

ファイルに書かれたものを「そのまま」読むから、" で囲むと読んで得られたファイル名の前後に余計な " がついてしまう。
hikarhikar

2020/04/12 06:34

epistemeさんご返信ありがとうございます。 助かりました。本当にありがとうございました(*´▽`*)
guest

0

fopen_s(&fobj, "OBJ//mikuobjx.txt", "r");

この場合、パスの起点となる場所は、実行ファイルがある場所、となります
#カレントパスの設定をしてるならその場所

実行ファイルがどこにあるのか、をまず探してみよう

投稿2020/04/11 07:18

y_waiwai

総合スコア88042

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

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

hikarhikar

2020/04/11 13:07

y_waiwaiさんご返信ありがとうございます。 情報不足申し訳ありませんでした。<(_ _)> 再度編集させていただきました。 エラーとなったファイルはloadTxt関数内の「erro = fopen_s(&ftxt, ReadFile[0], "rb");」の場所なのですが、pepperleafさんの返答に詳細を書かせていただいたので、良ければ何がいけないのかお教えください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問