テキストファイルに出力け結果を列で書き込んで行きたいのですがうまくいきません。以下に示す形です。1は一番目の出力結果、2は二番目の出力結果です。どなたかご教授ください。
1 2
* *
* *
* *
日本語が理解できません。
何がしたいのでしょうか?さっぱりわからん。
fprintf(f, "%d %d\n", result1[i], result2[i]);
とか?
い番目には
for ( i = 0; i < 6; i++){
{
for ( j = 0; j < 5; j++)
fprintf(fp4," %lf \n ",k1[i][j]);
}
}
fprintf(fp4," \n");
for ( i = 0; i < 6; i++){
for ( j = 0; j < 1; j++)
{
fprintf(fp4," %lf\n ",k2[i][j]);
}
}
このようにK1、k2に何らかの値があるとしますとテキスト出力ですとK1からk2と上から書き込まれます。このK1からk2が一回目のループ処理と考え、またfor文で制御し、二回目、三回目の結果をひとつのテキストに上述の様に保存したいのですがうまくいきません。
すいません。一行目は関係ありません。
編集 削除やってできなくはないけどメンドクサイというか遅いです。
k1 k2 両方を計算完了してから一度に fprintf するほうが簡単で速い。
すいません。
k1からk2は外部処理で更新したいのです。k1、k2は出力上、縦並びでひとつになっているようなのですが、別々です。この更新されたk1、k2を横に出力させていくにはどうしたらいいか分からないのです。
そのfprintfの方法をご教授いただけますか。
1回目 二回目
*k1 *更新k1
*k1 *更新k1
*k2 *更新k2
*k2 *更新k2
要するに行末に追記するだけでしょ ?
それなら最初からそう言えばよいのに。
ファイル1つではできません。元ファイルと出力先ファイルと2つ用意し
fgets(str, sizeof(str)/sizeof(str[0]), infp);
fprintf(outfp, "%s %f\n", str, k1);
とか。
ところで %lf って間違っていませんか?
現在、tetrapod様が指摘してくださったように実行していますが、
なんとなくできそうなのですが、うまくいきません。
strの宣言が間違っているのでしょうか?
私は今、char str[]のように宣言しています。
%lf
すいません。私の説明不足でした。k1,k2にはかなり小さい小数が入っています。その為に%lfを用いています。
char str[128]; のようにしないと意味ないです。
ポインタと配列の違いと類似性に関する理解、大丈夫ですか?
double 値を表示するのに %lf を使うのは誤りです。
http://www.catnet.ne.jp/~kouno/c_faq/c12.html 12.9
桁数や精度を指定すれば小さい数でも望みどおり出力されます。
スペースのうしろまでリンクになっちゃってますねぇ... イクナイ!
http://www.catnet.ne.jp/~kouno/c_faq/c12.html#9
たびたびすいません。
tetrapodさん御指摘を頂き、以下の流れのソースに追加いたしました。
追加箇所が悪いのかうまく表示できません。
何かご助言をいただけたら嬉しいです。
doubleの件まで御指摘有難うございました。
勉強いたします。
int main()
{
char str[128]//tetrapodさん御指摘
*
*
*
int count;
for(count=0 ; count<10; count++)
{
**********************
k1,k2更新
**********************
if(********************)
{ //なんらかの条件のときだけ
for ( i = 0; i < a; i++){
{
for ( j = 0; j < b; j++)
fprintf(fp1," %f \n ",k1[i][j]);//
}
}
fprintf(fp1," \n");
for ( i = 0; i < b+1; i++){
for ( j = 0; j < c; j++)
{
fprintf(fp1," %f\n ",k2[i][j]);
}
}
fprintf(fp1," \n");//w1 w2
}//count終了
fgets(str, sizeof(str)/sizeof(str[0]),fp1);//tetrapodさん御指摘
fprintf(fp2, "%s %f\n", str, k1);//tetrapodさん御指摘
fclose(fp1);
fclose(fp2);
return 0;
}
fprintf(fp1," \n");//w1 w2
はfprintf(fp1," \n");//k1 k2
の間違いです。失礼しました。
はぁ... ループの外に置いてどうするんですか。
fprintf(fp1," %f \n ",k1[i][j]);
を (k2 も)
fgets(str,sizeof(str)/sizeof(str[0]),infp);
fprintf(outfp,"%s %f\n", str,k1[i][j]);
にするんですよ。
その際には元ファイルと先ファイルの両者を fopen しないといけません。
もしくは行結合用に別ツールを作るとか。 awk や perl で数行ってところ。
すいません。
私の理解力不足で・・
しかし、ご指摘もあり大分分かってまいりました。修正を行い、幾度か試みました。
その結果、テキストが以下のような形で文字化けを起こしてしまいます。
なぜでしょうか。
面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面┬Uヤ*j疑{ョG痙・ョ瀅\X^?B棕0・面面 0.021732
面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面┬Uヤ*j疑{ョG痙・ョ瀅\X^?B棕0・面面 0.551126
すいません。
私の理解力不足で・・
しかし、ご指摘もあり大分分かってまいりました。修正を行い、幾度か試みました。
その結果、テキストが以下のような形で文字化けを起こしてしまいます。
なぜでしょうか。
面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面┬Uヤ*j疑{ョG痙・ョ瀅\X^?B棕0・面面 0.021732
面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面面┬Uヤ*j疑{ョG痙・ョ瀅\X^?B棕0・面面 0.551126
元ファイルを正しく読み取れていない場合の典型的症状です。
fgets に成功しているかどうか。
そもそも元ファイルを正しく fopen できているか。
調べましょう。
プログラムって言うのは闇雲に作っても話になりません。
fgets() って何者か、どんな動作するのか、わかってますか?
それがわかれば、前提条件もわかるはず。
# どうも infp が正しく開いていないような気がする。
# っていうかその処理ちゃんと入ってますか?
# 「ファイル2つ開きなさい」って意味わかってますか?
fprintf(fp1," %f\n ",k2[i][j]);
infpは私の場合、上述したfp1に値するものだと思います。
openしたfp1に対応するテキストにはきれいに値が格納されています。
現在
fprintf(fp1," %f \n ",k1[i][j]);//この下に以下の箇所を足しました。
そしてこの部分のファイルポインタに対応するテキストには値が格納されています。
fgets(str,sizeof(str)/sizeof(str[0]),fp1);と処理して実行しています。
fprintf(fp2,"%s %f\n", str,k1[i][j]);
いやだから妄想や憶測でプログラム書いたりデバッグしても仕方ないんです。
> fprintf(fp1," %f \n ",k1[i][j]);//この下に以下の箇所を足しました。
わたしは「置き換えろ」って言ったつもりなんですが。
「追加しろ」などとは言っていません。
>そしてこの部分のファイルポインタに対応するテキストには値が格納されています
日本語の意味不明。
>infpは私の場合、上述したfp1に値するものだと思います。
思いますでは何の意味も無いんです。そして実際違う (はず)
# ソースが無いからこっちは推測するしかない。
fp1 は fopen(..,"w") で開いているのでしょうか?
だとしたら fgets は失敗します。
ソース直す前に fgets や fopen の解説を100回読みましょう。
「ファイル2つ開く」と私が書いた意味を本当に理解していますか?
答書いちゃうのは簡単だけど...
# 半分くらい答え書いちゃいたい気分。
あ、1つ抜けてた。
fgets は改行を捨てずに読み込むので削除処理が必要だ。
if (buf[strlen(buf)-1]=='\n') buf[strlen(buf)-1]=0;
しないとまずいな。
多くのご助言感謝いたします。
ただ、小生の力量不足でまだ実行できません。fopen、fgetsの関係は大丈夫です。
FILE *fp1;
char fname1[100];
sprintf(fname1,"1.txt");
if((fp1=fopen(fname1,"r"))==NULL){
printf("cannot open file1.");
return 0;
}
FILE *fp2;
char fname2[100];
sprintf(fname2,"1.txt");
if((fp2=fopen(fname2,"w"))==NULL){
printf("cannot open file2.");
return 0;
}
openのほうは上記のようになっていまして実行するとfgetsで大分読み込めるようにはなりましたが、以下のように"ヘ"がたくさん入ったり2.txtには列で保存ができていません。
なぜでしょうか。
-0.563528
0.255806
0.675814
0.195088
-0.088690
0.242909
0.552633
0.124870
-0.337419
ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ -0.877075
0.864644
-0.892380
-0.599959
-0.134380
-0.517504
-0.252488
-0.478991
0.371564
-0.792687
ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ -0.827926
だーかーらー。すでに答えは書いてあるんですが。
> ファイル1つではできません。
というのは FILE* がひとつの意味ではありません。
私のミスで以下のようにテキストファイルを2つは作っています。
FILE *fp1;
char fname1[100];
sprintf(fname1,"1.txt");
if((fp1=fopen(fname1,"r"))==NULL){
printf("cannot open file1.");
return 0;
}
FILE *fp2;
char fname2[100];
sprintf(fname2,"2.txt");
if((fp2=fopen(fname2,"w"))==NULL){
printf("cannot open file2.");
return 0;
}
答えるほうは質問者が示した内容しか判断基準が無い、というのはご理解いただけますね。
誤ったコードを提示されても、それを基に判断するしかないのです。
掲示板の発言ではスペースの都合等でエラー処理などを割愛する場合があります。
私の提示したコードはエラー処理が入っていません。
うまく動かない場合はご自分でエラー処理を追加してください。
なんか埒があかないっぽいので次のようなソースを組んでみました。
参考にしてください。
#include <stdio.h>
int main(int argc, char* argv[]) {
int i;
FILE* f[100];
char buf[128];
if (argc>=100) return 1;
for (i=1; i<argc; ++i) {
f[i]=fopen(argv[i], "r");
}
do {
for (i=1; i<argc; ++i) {
if (fgets(buf, 128, f[i])) {
if (buf[strlen(buf)-1]=='\n') buf[strlen(buf)-1]='\0';
fprintf(stdout, "%s ", buf);
}
}
fprintf(stdout, "\n");
} while (!feof(f[1]));
for (i=1; i<argc; ++i) {
fclose(f[i]);
}
}