ページ 1 / 1
無題
Posted: 2009年12月16日(水) 13:14
by poi
配列ファイル(下は、任意の数字)
12
←空白
315
2132
23
を読み込み、
1 322
2 113
53
2
↑
空
白
の転置行列(空白の行も、列に対応)をするプログラムは作成できるのでしょうか?
Re:無題
Posted: 2009年12月16日(水) 13:24
by sizuma
できます。
Re:無題
Posted: 2009年12月16日(水) 15:01
by non
ちょっとわからない。
>配列ファイル
って何ですか?このような文字列が、全角文字で入っているファイルと考えていいのでしょうか?
数値は必ず、1桁なのでしょうか?行列の大きさは?ファイルを読んで、自動で判断する?
で、それを、転置行列を求めて、求めた後はどうするのでしょうか?
Re:無題
Posted: 2009年12月16日(水) 16:17
by 初級者
入力データが行列の形になっているように見えません。
何行何列の行列なのでしょうか?
Re:無題
Posted: 2009年12月17日(木) 14:09
by poi
>sizumaさん nonさん 初級者さん
回答ありがとうございます。
5X5の行列のサイズで、
「r.txt」に下のような数字が入っています。
(数字は1桁で半角、数字は手入力、空白の行もあり)
1 2
←空白
3 1 5
2 1 3 2 1
2 3
上記のファイルを読み込み、下記の数字に転置して、「w.txt」に下記の数字を
書き込むことを行っていますが、上手く転置できない状態です。
1 3 2 2
2 1 1 3
5 3
2
1
↑
空
白
/****************ファイル読み込み********************/
file=fopen("r.txt","r");
for(i=0; i<PI_H; i++){
for(j=0; j<PI_W; j++){
fscanf(file,"%d", &PixelData[j]);
}
}
fclose(file);
/*******************ファイル書き込み****************/
file=fopen("w.txt","w");
for(j=0; j<PI_W; j++){
for(i=1+j; i<PI_H; i++){
buf=PixelData[j];
PixelData[j]=PixelData[j];
PixelData[j]=buf;
if(PixelData[j]>0)fprintf(file,"%d ",PixelData[j]);
}fprintf(file,"\n");
}
fclose(file);
を作成しr.txtの数字を入力しましたが、
123152132123
13
315
21321
23
11
11
2
と出力されました。
Re:無題
Posted: 2009年12月17日(木) 14:25
by Mist
preタグ使用しないと半角空白、タブは削除されちゃうから見づらくて。
1 3 2 2
2 1 1 3
5 3
2
1
/****************ファイル読み込み********************/
file=fopen("r.txt","r");
for(i=0; i<PI_H; i++){
for(j=0; j<PI_W; j++){
fscanf(file,"%d", &PixelData[j]);
}
}
fclose(file);
/*******************ファイル書き込み****************/
file=fopen("w.txt","w");
for(j=0; j<PI_W; j++){
for(i=1+j; i<PI_H; i++){
buf=PixelData[j];
PixelData[j]=PixelData[j];
PixelData[j]=buf;
if(PixelData[j]>0)fprintf(file,"%d ",PixelData[j]);
}fprintf(file,"\n");
}
fclose(file);
Re:無題
Posted: 2009年12月17日(木) 14:33
by バグ
有効な値(r.txtファイルに書き込まれる値)が0の場合というのは有りうるのでしょうか?
文字のまま扱ってはいけないのでしょうか?
数値に置き換えなければいけないのでしょうか?
Re:無題
Posted: 2009年12月17日(木) 15:01
by Mist
添付テキストのような条件だったら動くソース。
参考にしてください。
#include <stdio.h>
#include <string.h>
#define PI_H 5
#define PI_W 5
int main(void)
{
FILE *file;
char PixelData[PI_H][PI_W];
int read, i, j;
char buf;
memset(PixelData, ' ', sizeof(PixelData));
/****************ファイル読み込み********************/
file=fopen("r.txt","r");
for(i=0; i < PI_H; i++){
for(j=0; ; j++){
read = fgetc(file);
if (read == '\n' || read == EOF) {
break;
}
if (j < PI_W) {
PixelData[j] = (char)read;
}
}
}
fclose(file);
/*******************入れ替え****************/
for(j=0; j<PI_W; j++){
for(i=1+j; i<PI_H; i++){
buf=PixelData[j];
PixelData[j]=PixelData[j];
PixelData[j]=buf;
}
}
/*******************ファイル書き込み****************/
file=fopen("w.txt","w");
for(i=0; i<PI_H; i++){
for(j=0; j<PI_W; j++){
fprintf(file, "%c", PixelData[j]);
}
fprintf(file, "\n");
}
fclose(file);
return 0;
}
Re:無題
Posted: 2009年12月17日(木) 15:11
by たいちう
ファイル書き込みの前に、
for(i=0; i<PI_H; i++){
for(j=0; j<PI_W; j++){
printf("%d ", PixelData[j]);
}
printf("\n");
}
と追加してみれば、読み込みに失敗していることは明らか。
fgetsとsscanfを使うのが定石でしょう。例を探してみてください。
Re:無題
Posted: 2009年12月17日(木) 15:29
by バグ
fgetsとsscanfでは空白の後に数字があった場合に変換できないのでは?
Mistさんの取られたfgetcで一文字ずつチェックするしかないと思います。
Re:無題
Posted: 2009年12月17日(木) 17:48
by たかぎ
> fgetsとsscanfでは空白の後に数字があった場合に変換できないのでは?
やってやれないことはありませんね。
Re:無題
Posted: 2009年12月17日(木) 17:51
by バグ
>>たかぎさん
え?空白箇所を無効な値として判断できますか?(^_^;)
どうやるんでしょうか?
Re:無題
Posted: 2009年12月17日(木) 18:12
by たかぎ
極端な話、sscanf(str, "%c", &c) で1文字ずつ処理すればよいのです。
実際には、"%[^ ]"とか、もっと気の利いた書式も使えると思います。
Re:無題
Posted: 2009年12月18日(金) 13:52
by poi
>Mistさん バグさん たかぎさん たいちうさん
みなさんのおかげで、先ほどプログラムが完成しました。
まことにありがとうございます。