現在、テキストには以下のような並びで数値、文字が保存されています。
これを一列ごと読み込み、保存し、11個のファイル(1から11)を生成したいのですが
以下のような形しか、考えることが出来ません。
そこで皆様にアドバイスを頂きたいのですが、何かいい方法がありましたらご教授くだ
さい。宜しくお願いいたします。
A 1 2 3 4 5 6 7 8 9 10
B 1 2 3 4 5 6 7 8 9 10
C 1 2 3 4 5 6 7 8 9 10
D 1 2 3 4 5 6 7 8 9 10
E 1 2 3 4 5 6 7 8 9 10
#include stdafx.h
#include <stdio.h>
#include <stdio.h>
int main()
{
char line[100];
int a[100];
int b[100];
int c[100];
int d[100];
int e[100];
FILE *fp1;
char fname1[100];
sprintf(fname1,1.txt);
if((fp1=fopen(fname1,w+))==NULL){
printf(cannot open file1.);
return 0;
}
FILE *in_file;
in_file = fopen(test.txt, r);
if ( in_file == NULL ) {
printf( fopen() error );
return 0;
}
while( fgets( line, 100, in_file ) != NULL ) {
sscanf( line, %s %s %s %s %s, a, b, c, d, e );
printf( name=%s, %s, %s ,%s ,%s\n, a, b, c ,d ,e);
fprintf(fp1, %s\n, a );//1
/*ファイルポインタを何個か利用する。
fprintf(fp2, %s\n, b );//2
fprintf(fp3, %s\n, c );//3
fprintf(fp4, %s\n, d );//4
fprintf(fp5, %s\n, e );//5
*/
}
fclose(in_file);
return 0;
fclose(fp1);
}
開発環境はwindows xp , VC++6.0 , console apllicationです。
宜しくお願いします。
> 現在、テキストには以下のような並びで数値、文字が保存されています。
> これを一列ごと読み込み、保存し、11個のファイル(1から11)を
> 生成したいのですが
結局1行ずつ別のファイルにバラして保存したい、という事なのでしょうか。
元ネタとファイル名の関係は単純に「元ネタの○行目」が「○.txt」になると考えていいの
でしょうか。
tib様
はい。おっしゃるとおりです。
前提条件が足りません。
提示されているファイルの内容でなければ、正常に動かなくて良いなら
簡略化した方法が取れます。
逆に状況に応じてある程度の対応が取れるような作りにしようというなら
それはそれでどの部分の条件が固定でどの部分の条件が可変なのかを
きちんと提示しなくてはなりません。
ソフトを組む場合、あいまいな点があってはソフトが組めませんから
何から何まできちんと決めてしまう必要があります。
そのプログラムを組むのにどういう取り決めが必要なのか
どの部分が決まっていないといけないのかを良く考えて条件を説明してください。
そうしないとプログラムの成否も判断できません。
違うのでは?
何列目でしょう?
何行目ではなくて。
そうでなくては、11個のファイルにならないと思いますけれど。
A 1 2 3 4 5 6 7 8 9 10
B 1 2 3 4 5 6 7 8 9 10
C 1 2 3 4 5 6 7 8 9 10
D 1 2 3 4 5 6 7 8 9 10
E 1 2 3 4 5 6 7 8 9 10
これを、
A B C D E
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
6 6 6 6 6
7 7 7 7 7
8 8 8 8 8
9 9 9 9 9
10 10 10 10 10
こう組み替えて、各行を別々のファイルに保存したいのですよね。
もうちょっとデータの意味とか期待している結果とかを提示してくれないと何とも答えら
れませんね。
今できるアドバイスは「型を合わせよう」という事くらいでしょうか。
わかりにくくて申し訳ないです。
A 1 2 3 4 5 6 7 8 9 10
B 1 2 3 4 5 6 7 8 9 10
C 1 2 3 4 5 6 7 8 9 10
D 1 2 3 4 5 6 7 8 9 10
E 1 2 3 4 5 6 7 8 9 10
このテキスト(data.txt)の各列をABCDEから10 10 10 10 10までを読み込み、それぞれ
のファイル(11個)に保存させたいのです。
Aの列が1個としますと、10列目までで11個のファイルになるようにしたいです。
既に書いていますが、
元になるファイルは必ずこの形で他の状況を想定する必要は無いのですか?
列と列の間は必ずスペース一つで区切られていると考えていいのでしょうか?
一気に読み込んでしまってメモリ上で組み替えても良いのか?
それともなるべくメモリを使わないようにして処理をする必要があるのか?
この形に合わせてそれ専用に作れば、チェックなんかも省けるし楽できます。
但し、そういう風に作ってしまうとちょっと元データが換わったらそのプログラムは
使えなくなってしまいます。
何処までの仕様を要求しているのかでプログラムの作りやコードの量も変わります。
そういうところをはっきりさせてください。
自分自身でもわからないのであれば、出題者にきちんと尋ねましょう。
PATIO様
本当にご親切に有難うございます。
>元になるファイルは必ずこの形で他の状況を想定する必要は無いのですか?
A 1 2 3 4 5 6 7 8 9 10 11
B 1 2 3 4 5 6 7 8 9 10 11
C 1 2 3 4 5 6 7 8 9 10 11
D 1 2 3 4 5 6 7 8 9 10 11
E 1 2 3 4 5 6 7 8 9 10 11
F 1 2 3 4 5 6 7 8 9 10 11
のように行と列は増えることも想定します。
11個(現在)のデータをA、B、C、・・・、でグループ分けを出来るようにしたいです。
>列と列の間は必ずスペース一つで区切られていると考えていいのでしょうか?
はい。スペースがあります。
一気に読み込んでしまってメモリ上で組み替えても良いのか?
それともなるべくメモリを使わないようにして処理をする必要があるのか?
出来ればメモリをなるべく使わないように処理をしたいですが、
このソースはファイルを分類するためだけに使用しようと考えています。
本当にいろいろ有難うございます。
> 11個(現在)のデータをA、B、C、・・・、でグループ分け
これが解りません。結局こういう事ですか?
入力:
A 1 2 3 4 5 6 7 8 9 10 11
B 1 2 3 4 5 6 7 8 9 10 11
C 1 2 3 4 5 6 7 8 9 10 11
D 1 2 3 4 5 6 7 8 9 10 11
E 1 2 3 4 5 6 7 8 9 10 11
F 1 2 3 4 5 6 7 8 9 10 11
出力:
1.txt→A B C D E F
2.txt→1 1 1 1 1 1
3.txt→2 2 2 2 2 2
(中略)
12.txt→11 11 11 11 11 11
各行の列数は揃っていると前提にしていいんですか?例えば、入力が
A 1 2 3 4 5 6 7 8
B 1 2 3 4 5 6 7 8 9 10
C 1 2 3 4 5 6 7 8 9 10 11
D 1 2 3 4 5
E 1 2 3 4 5 6 7 8 9
F 1 2 3 4 5 6 7
みたいになっているという事は「絶対に」ないと思っていていいんですか?
>各行の列数は揃っていると前提にしていいんですか?例えば、入力が
A 1 2 3 4 5 6 7 8
B 1 2 3 4 5 6 7 8 9 10
C 1 2 3 4 5 6 7 8 9 10 11
D 1 2 3 4 5
E 1 2 3 4 5 6 7 8 9
F 1 2 3 4 5 6 7
>みたいになっているという事は「絶対に」ないと思っていていいんですか?
はい。
AからFまでの内容を同じ数のデータで比べようという目的で作っています。
宜しくお願いします。
こんな感じでしょうか。エラー処理は省略しています。
入力用のファイルをオープンする。
1行読み込んで何列あるか数える。
列数分、ファイルポインタ型の配列を確保する。
列数分繰り返し・ここから
出力用ファイル名を生成する。
出力用ファイルをオープンする。
列数分繰り返し・ここまで
行数分繰り返し・ここから
入力用ファイルから1行読み込む。
列数分繰り返し・ここから
空白文字をデリミタにして、1トークン切り出す。
切り出したトークンを、然るべき出力用ファイルに出力する。
列数分繰り返し・ここまで
行数分繰り返し・ここまで
入力用ファイルをクローズする。
列数分繰り返し・ここから
出力用ファイルをクローズする。
列数分繰り返し・ここまで
> AからFまでの内容を同じ数のデータで比べようという目的で作っています。
> 宜しくお願いします。
なんだか当初の「アドバイスを頂きたい」から「代わりにコーディングして」に変わって
きているような雰囲気を感じてしまったので敢えてCでなく日本語で記述しちゃいまし
た。上記ロジックでは、いきなり2行目から処理してしまわないように注意してください。
おっと、ここままではメモリリークしてしまいますね。そこも注意してください。