ページ 1 / 1
正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月17日(水) 14:46
by つばさ
連日の投稿、失礼いたします。
開発環境はC++です。
以下のコードで2つのテキストデータを読み込んで1つのテキストデータに書き出す作業を行いたいと考えています。
読込先のファイルパスが悪いのかわかりませんが空白が出力されるだけで元のデータを文字列として出力することが出来ません。
皆様の助言をいただきたいのでどうぞよろしくお願いいたします。
コード:
#include <string>
#include <fstream>
#include <iostream>
#include <stdio.h>
using namespace std;
int robot_cam::generation_sample_mat_theta()
{
int file_num = 1;
int folder_name ;
cout << "参照データのフォルダ名を入力してください" << endl;
scanf ("%s" , &folder_name);
while(file_num < 5833)//ファイルが5832個存在するため
{
ifstream ifs_1("A.txt");//元のデータA
ifstream ifs_2("TLT\\%s\\%s\\B.txt" ,folder_name*,file_num);//元のデータB
ofstream ofs("sample_mat\\C.txt");//出力するデータC
string buf_1;
string buf_2;
getline(ifs_1 , buf_1);
getline(ifs_2, buf_2);
cout << buf_2 << endl;
ofs << buf_1 << " " << buf_2 << endl;
cout << buf_1 << " " << buf_2 << endl;
file_num++;
}
return 0;
}
以上です。ほかにもコードの書き方でよくない点があればご指摘いただければと思います。
よろしくお願いいたします。
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月17日(水) 15:05
by maru
つばさ さんが書きました:皆様の助言をいただきたいのでどうぞよろしくお願いいたします。
デバッグすればよいと思います。
つばさ さんが書きました:ほかにもコードの書き方でよくない点があればご指摘いただければと思います。
とりあえず、
1.インデントがそろっていない。
2.エラーチェックが一切ない。
3.コンパイルが通らないコードだ。
4.マジックナンバーを使用している。
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月17日(水) 15:41
by つばさ
maru様、お忙しいところ早速のご指摘ありがとうございます。
1~4の項目の内容を自分なりに解釈してコードを修正してみました。
現状、デバックして動作した後ファイルの読み込み時にエラーが出てしますのですが原因がわかりません。
何か以下のコードを見て問題点がお分かりでしたら再度ご指摘いただければと思います。
よろしくお願いいたします。
コード:
#include <string>
#include <fstream>
#include <iostream>
#include <stdio.h>
using namespace std;
int robot_cam::generation_sample_mat_theta()
{
int file_num = 1;
int folder_name ;
int file_num_max;
ofstream ofs("sample_mat\\C.txt");//出力するデータC
if(!ofs)
{
cout << "出力ファイルの展開に失敗" << endl;
exit(1);
}
cout << "応答曲面法に使用するサンプル行列を作成します" << endl;
cout << "参照データのフォルダ名(作成日時12桁)を入力してください" << endl;
scanf ("%s" , &folder_name);
cout << "ファイルの総数を入力してください" << endl;
scanf( "%d" ,&file_num_max);
while(file_num < file_num_max + 1)
{
ifstream ifs_1("sample_mat\\A.txt");//元のデータA
if(!ifs_1)
{
cout << "元のワーク配置候補データファイルの参照に失敗" << endl;
exit(1);
}
ifstream ifs_2("TLT\\%s\\%s\\B.txt" ,folder_name,file_num);//データB
if(!ifs_2)
{
cout << "データファイルBの参照に失敗" << endl;
exit(1);
}
string buf_1;
string buf_2;
getline(ifs_1 , buf_1);
getline(ifs_2, buf_2);
ofs << buf_1 << " " << buf_2 << endl;
cout << buf_1 << " " << buf_2 << endl;
file_num++;
}
return 0;
}
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月17日(水) 17:21
by maru
いまだにインデントがそろっていないようですが...
23行目、文字列を読み込むのに int 型の変数のポインタを指定しています。
実行時にエラーが発生するようなら、その時の変数の値を確認してください。
(エラーが発生しなくても変数、プログラムの流れを確認し、アルゴリズムが正しいかを確認するのが完成への早道。)
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月17日(水) 17:27
by maru
maru さんが書きました:23行目、文字列を読み込むのに int 型の変数のポインタを指定しています。
実行時にエラーが発生するようなら、その時の変数の値を確認してください。
(エラーが発生しなくても変数、プログラムの流れを確認し、アルゴリズムが正しいかを確認するのが完成への早道。)
でも、このバグは変数を確認してもわからないかもしれませんね。
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月17日(水) 17:32
by つばさ
maru様、ご指摘ありがとうございます。
23行目の入力を受けた内容を画面に改めて出力すると全く別の値になっていました。
scanfの使い方そのものもあまり理解できていないのですがどのような関数で読み込めば数字12桁を正常に読み込むことが出来るでしょうか?
再度、質問という形になってしまい申し訳ありません。よろしくお願いいたします。
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月17日(水) 17:34
by かずま
main() がなくてなぜ実行できるんですか?
コード:
#include <iostream> // cin, cout, endl
#include <fstream> // ifstream
#include <sstream> // ostringstream
#include <string> // string
using namespace std;
int main()
{
int n;
cout << "num: ", cin >> n;
string f;
cout << "folder: ", cin >> f;
for (int i = 1; i <= n; i++) {
ostringstream oss;
oss << i;
string name = "TLT\\" + f + "\\" + oss.str() + "\\B.txt";
cout << name << endl;
// ifstream ifs(name); or ifstream ifs(name.c_str());
}
return 0;
}
これを参考にして、できたプログラムを貼り付けてください。
エラーが出る場合は、エラーメッセージを貼り付けてください。
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月17日(水) 17:43
by かずま
すみません。こっちのほうがいいでしょう。
コード:
for (int i = 1; i <= n; i++) {
ostringstream name;
name << "TLT\\" << f << "\\" << i << "\\B.txt";
cout << name.str() << endl;
// ifstream ifs(name.str());
}
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月17日(水) 17:47
by maru
つばさ さんが書きました:23行目の入力を受けた内容を画面に改めて出力すると全く別の値になっていました。
デバッガを使えば画面に出力しなくても、値を確認することができます。
つばさ さんが書きました:scanfの使い方そのものもあまり理解できていないのですがどのような関数で読み込めば数字12桁を正常に読み込むことが出来るでしょうか?
scanf で12桁の文字列を取得するには
コード:
char str12[12+1];
scanf("%s", str12);
とすれば可能ですが、13文字以上を入力すると用意した領域を破壊してしまいますのでお勧めしません。
ファイルの入出力、文字列の出力にストリームを使用しているので、ここは入力ストリーム(cin)を使用しましょう。
コード:
string fine_name;
cin >> fine_name;
確認していないので、悪しからず。
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月17日(水) 17:55
by maru
あれ? 38行目、ifstream に文字列をフォーマットする機能はなかったはずだが?
コード:
ifstream ifs_2("TLT\\%s\\%s\\B.txt" ,folder_name,file_num);//データB
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月17日(水) 18:09
by つばさ
かずま様、早速の返信ありがとうございます。
main文は別に用意されている状態でこのコードは robot_cam::generation_sample_mat_theta をmain文で呼び出すことによって動作しています。
添付していただいたコードによって参照したいファイルのファイルパスが正常に格納していることを確認できました。
コード:
#include <iostream> // cin, cout, endl
#include <fstream> // ifstream
#include <sstream> // ostringstream
#include <string> // string
#include "robot_cam.h"
using namespace std;
int robot_cam::generation_sample_mat_theta2()
{
int n;
cout << "ファイル総数: ", cin >> n;
string f;
cout << "参照フォルダ名: ", cin >> f;
for (int i = 1; i <= n; i++) {
ostringstream oss;
oss << i;
string name = "TLT\\" + f + "\\" + oss.str() + "\\sum_theta_norm.txt";
cout << name << endl;
// ifstream ifs(name); or ifstream ifs(name.c_str());
}
return 0;
}
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月17日(水) 18:35
by つばさ
maru様、ありがとうございます。
maru様の方法で無事に12桁の数字を取得できるようになりました。
38行目の問題が重要だったようです。
かずま様からご指摘いただいたようにファイルパスを格納する場所を作ることにより意図したとおりのファイルパスを格納しながらループを作ることが出来ました。
貴重なお時間をいただき本当にありがとうございました。
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月18日(木) 08:07
by かずま
コード:
int n;
cout << "ファイル総数: ", cin >> n;
多くの処理系で、int は 32ビットなので、2147483647
までしか収容できず、12桁の整数を読み込めません。
int を long long にすれば可能ですが、必要ですか?
また、scanf で 12桁の数字を読み込んだ場合、それを
数値として利用する方法をご存知ですか?
Re: 正常にファイルを参照できず、悩んでいます。
Posted: 2018年1月18日(木) 11:25
by かずま
つばさ さんが書きました:
main文は別に用意されている状態でこのコードは robot_cam::generation_sample_mat_theta をmain文で呼び出すことによって動作しています。
main は、文ではなく、関数です。
プログラムの実行は main関数から始まると言われますが、
C++ の場合、グローバル変数の初期化が先に行われるので
main関数から始まるとは限りません。
コード:
#include <iostream>
int func()
{
std::cout << "func: return 23\n";
return 23;
}
int n = func();
int main()
{
std::cout << "main: n = " << n << "\n";
}
実行結果
コード:
func: return 23
main: n = 23