入力したいです。 – プログラミング – Home

通知
すべてクリア

[解決済] 入力したいです。


四万十川
 四万十川
(@四万十川)
ゲスト
結合: 21年前
投稿: 13
Topic starter  

ファイル操作について質問があります。
data.txtには1から150までの値が横に並んでいます。
1 2 3 4 5 6・・・
これを
下の二次元のtx,ty配列に以下のようにして入れたいのですが
123
234
345
456
横がinput,output,縦はサンプル数です。
以下のソースからつまってぬけだせません。
エレガントな入力方法がありましたら教えていただければうれしいです。
宜しくお願いします。
#include <stdlib.h>
#include <stdio.h>

#define NUM_SAMPLE 150
#define NUM_INPUT 2
#define NUM_OUTPUT 1

double tx[200][100], ty[200][100];
double txx[200], tyy[200];

int main()
{
int isample;
int i, j;

FILE *stream;

stream = fopen( data.txt, r);
if (stream == NULL)
{
printf(ファイルdata1.txtをオープンできません.\n);
exit(0);
}
else{
/*ファイルからデータを読み込む*/
int a;
a=0;
for( isample = 0; isample <NUM_SAMPLE; ++isample){

if(feof( stream ))
break;
for ( i = 0; i < NUM_INPUT; i++) {

if( !fscanf( stream, %lf, &tx[isample][i]) ){
fprintf(stderr, err : %f, isample);

break;
}
}
a=a+1;
for ( j = 0; j < NUM_OUTPUT; j++){
if( !fscanf( stream, %lf, &ty[isample][j]) ){
fprintf(stderr, err : %f, isample);
break;
}
}
}
int count;
count=0;

for( isample = 0; isample < NUM_SAMPLE; ++isample){

for ( i = 0; i < NUM_INPUT; i++) {
printf( %lf ,tx[isample + count][i]);
}

for ( j = 0; j < NUM_OUTPUT; j++) {
printf( %lf\n, ty[isample + count][j]);
}
}
fclose( stream);

}

return 0;}//


引用未解決
トピックタグ
Kazuki
 Kazuki
(@Kazuki)
ゲスト
結合: 22年前
投稿: 41
 

すいません
私の理解力が足りないのか何がしたいのかわかりません

二次元配列 txとtyに値を
123
234
345
456
のように入れると書かれていますが、txとtyに同じ値を入れるってことですか?
123 234 345 456という値は 1 ~ 150の数字の並びからどうやって計算するのでしょうか?
123 234 345 456という値を入れるのでしたら配列は1次元でいいような気がするのですが
何故二次元配列を使っているのですか?
そこらへんがわかりません。
 
> 横がinput,output,縦はサンプル数です。
何の横と縦ですか?

後プログラム中に無意味な変数が散りばめられていますがこれはどうしてですか?


返信引用
四万十川
 四万十川
(@四万十川)
ゲスト
結合: 21年前
投稿: 13
Topic starter  

すいません。
やりたいことは
1 2 3 4 5 6と並んだdata.txtから

1 2 3
2 3 4
3 4 5
・・・
148 149 150
(NUM_INPUT ) (NUM_OUTPUT )
現在NUM_INPUT 2
NUM_OUTPUT 1のため
三個の並びが出来ています。

上の並びの縦はサンプルの数
というふうにしたいのです。
無意味な変数はいろいろ考えてて残ったものです。
すいません。


返信引用
四万十川
 四万十川
(@四万十川)
ゲスト
結合: 21年前
投稿: 13
Topic starter  

data.txtには横に 1 2 3 4 ・・・150並んでいます。


返信引用
Kazuki
 Kazuki
(@Kazuki)
ゲスト
結合: 22年前
投稿: 41
 

txとtyには最終的まったく同じ値が入るって事ですか?


返信引用
四万十川
 四万十川
(@四万十川)
ゲスト
結合: 21年前
投稿: 13
Topic starter  

1 2 3
2 3 4
3 4 5
・・・
148 149 150
(NUM_INPUT ) (NUM_OUTPUT )
txには一番最初の行でいいますと1 2
tyも同様に最初の行でいいますと3

次のサンプルのときに
txには2 3
tyには 4
といった事が148サンプル(150まで)
出来るようにしたいのです。


返信引用
Kazuki
 Kazuki
(@Kazuki)
ゲスト
結合: 22年前
投稿: 41
 

NUM_INPUTが2 NUM_OUTPUTが1の時の動作はわかりましたが
NUM_INPUTが3でNUM_OUTPUTが4みたいな数字のときはどうなるんですか?
 
具体例だけじゃなくてもっと一般的に表してください。

後個人的にはC言語よりもC++が得意なのですが、C++でもOKですか?
後こういう場所で質問するときは、自分のOSや開発環境や言語くらいは書かないと
解答者が解答しにくくなります


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

#define NUM_SAMPLE 150
#define NUM_INPUT 2
#define NUM_OUTPUT 1

のそれぞれの意味を書いてください。


返信引用
RiSK
 RiSK
(@RiSK)
ゲスト
結合: 21年前
投稿: 21
 

/* 何をしたいのか分かりません… */
#include <stdio.h>

#define NUM_DATA 150
#define NUM_INPUT 2
#define NUM_OUTPUT 1
#define NUM_SAMPLE ((NUM_DATA) - (NUM_INPUT) - (NUM_OUTPUT) + 1)
#define DATA_FILE data.txt

int main(void)
{
FILE *fp;
int n, i, j, data[NUM_DATA];

if ((fp = fopen(DATA_FILE, r)) == NULL) {
fprintf(stderr, ファイル[ DATA_FILE ]をオープンできません.\n);
return 1;
}

for (n = 0; n < NUM_DATA; n++) {
fscanf(fp, %d, &data[n]);
}

for(n = 0; n < NUM_SAMPLE; n++) {
for (i = 0; i < NUM_INPUT; i++) {
printf(%d , data[n+i]);
}
for (j = 0; j < NUM_OUTPUT; j++) {
printf( %d\n, data[n+i+j]);
}
}

fclose(fp);

return 0;
}


返信引用
四万十川
 四万十川
(@四万十川)
ゲスト
結合: 21年前
投稿: 13
Topic starter  

皆様方多くのご指摘有難うございます。
現在data.txtには1 2 3 4 ・・・150が一行に並んでいます。
#define NUM_SAMPLE 148 150ではなく148でした。申し訳ございません。
これは以下の行をあらわしています。
1 2 3
2 3 4
3 4 5
・・・
148 149 150
(NUM_INPUT ) (NUM_OUTPUT )

#define NUM_INPUT 2

一行に入力の数、出力の数といった列を並ばせたいのです。
このNUM_INPUT は入力の数になります。
上の数字を使って表現しますと
一行目でいいますと1 2
二行目では2 3
三行目では3 4になります。
これをtx[NUM_SAMPLE ][NUM_INPUT ]の配列に入れたいのです。
#define NUM_OUTPUT 1
NUM_OUTPUTは出力の数になっています。
上の数字を使って表現しますと
一行目でいいますと3
二行目では4
三行目では5になります。

これをty[NUM_SAMPLE ][NUM_OUTPUT ]の配列に入れたいのです。
分かりにくくて申し訳ございませんが宜しくお願いいたします。


返信引用
四万十川
 四万十川
(@四万十川)
ゲスト
結合: 21年前
投稿: 13
Topic starter  

>NUM_INPUTが2 NUM_OUTPUTが1の時の動作はわかりましたが
>NUM_INPUTが3でNUM_OUTPUTが4みたいな数字のときはどうなるんですか?
この場合ですと、
サンプルの一行目が1 2 3が入力4 5 6 7が出力になります。
二行目は一つずれまして入力が2 3 4 出力が5 6 7 8になります。
 
C++でも大丈夫です。
開発環境はOS:
WINDOWS XP professional
VC++6.0を使用しております。

分かりにくくてすいません。


返信引用
.
 .
(@.)
ゲスト
結合: 23年前
投稿: 37
 

NUM_INPUT == 3
NUM_OUTPUT == 2

テキスト→1 2 3 4 5 6 7 8 9 結果(NUM_INPUT==3) 結果(NUM_OUTPUT==2)
1行目 - - - @ @ 123 45
2行目 - - - @ @ 234 56
3行目 - - - @ @ 345 67
4行目 - - - @ @ 456 78

#↑ずれていたらうまく出ませんが
#こういうことですよね?(多分)

NUM_INPUT・NUM_OUTPUTはおいといて(固定値で)
出せるようにしてみるのが先では?

上記でよければ初めにNUM_INPUT + NUM_OUTPUT分の文字を
取得して、3文字(NUM_INPUT)と2文字(NUM_OUTPUT)に分けるほうが
楽ではないでしょうか?
ex buf =12345
strncpy(buf1 , buf ,3); buf1[3]= '\0';
strncpy(buf2 , &buf[3] , 2);buf2[2]= '\0';
とか。

#ソース見ていないのでそのような実装だったらごめんなさい。

テキストが「1 2 3 4 5 6 7 8・・」の時ではなく
「12345678・・」の時で作成して拡張していくのが吉かと。


返信引用
Kazuki
 Kazuki
(@Kazuki)
ゲスト
結合: 22年前
投稿: 41
 

>NUM_INPUTが2 NUM_OUTPUTが1の時の動作はわかりましたが
>NUM_INPUTが3でNUM_OUTPUTが4みたいな数字のときはどうなるんですか?
この場合ですと、
サンプルの一行目が1 2 3が入力4 5 6 7が出力になります。
二行目は一つずれまして入力が2 3 4 出力が5 6 7 8になります。
これだと
NUM_SAMPLEが148の場合
148行目は…
tx[147][] = {148, 149, 150};
ty[147][] = {151, 152, 153, 154};
になってしまいませんか?


返信引用
四万十川
 四万十川
(@四万十川)
ゲスト
結合: 21年前
投稿: 13
Topic starter  

皆様有難うございました。
皆様のご意見はかなり参考になりました。
もう少し、自分で考えさせていただきます。
有難うございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました