ファイル操作について – プログラミング – Home

通知
すべてクリア

ファイル操作について

固定ページ 1 / 2

中村
 中村
(@中村)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

現在、テキストには以下のような並びで数値、文字が保存されています。
これを一列ごと読み込み、保存し、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);
}


引用解決済
トピックタグ
中村
 中村
(@中村)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

開発環境はwindows xp , VC++6.0 , console apllicationです。
宜しくお願いします。


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

> 現在、テキストには以下のような並びで数値、文字が保存されています。
> これを一列ごと読み込み、保存し、11個のファイル(1から11)を
> 生成したいのですが

結局1行ずつ別のファイルにバラして保存したい、という事なのでしょうか。
元ネタとファイル名の関係は単純に「元ネタの○行目」が「○.txt」になると考えていいの
でしょうか。


返信引用
中村
 中村
(@中村)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

tib様

はい。おっしゃるとおりです。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

前提条件が足りません。
提示されているファイルの内容でなければ、正常に動かなくて良いなら
簡略化した方法が取れます。
逆に状況に応じてある程度の対応が取れるような作りにしようというなら
それはそれでどの部分の条件が固定でどの部分の条件が可変なのかを
きちんと提示しなくてはなりません。

ソフトを組む場合、あいまいな点があってはソフトが組めませんから
何から何まできちんと決めてしまう必要があります。
そのプログラムを組むのにどういう取り決めが必要なのか
どの部分が決まっていないといけないのかを良く考えて条件を説明してください。
そうしないとプログラムの成否も判断できません。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

違うのでは?
何列目でしょう?
何行目ではなくて。

そうでなくては、11個のファイルにならないと思いますけれど。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

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

こう組み替えて、各行を別々のファイルに保存したいのですよね。


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

もうちょっとデータの意味とか期待している結果とかを提示してくれないと何とも答えら
れませんね。

今できるアドバイスは「型を合わせよう」という事くらいでしょうか。


返信引用
中村
 中村
(@中村)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

わかりにくくて申し訳ないです。
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
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

既に書いていますが、

元になるファイルは必ずこの形で他の状況を想定する必要は無いのですか?

列と列の間は必ずスペース一つで区切られていると考えていいのでしょうか?

一気に読み込んでしまってメモリ上で組み替えても良いのか?
それともなるべくメモリを使わないようにして処理をする必要があるのか?

この形に合わせてそれ専用に作れば、チェックなんかも省けるし楽できます。
但し、そういう風に作ってしまうとちょっと元データが換わったらそのプログラムは
使えなくなってしまいます。
何処までの仕様を要求しているのかでプログラムの作りやコードの量も変わります。
そういうところをはっきりさせてください。
自分自身でもわからないのであれば、出題者にきちんと尋ねましょう。


返信引用
中村
 中村
(@中村)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

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、・・・、でグループ分けを出来るようにしたいです。

>列と列の間は必ずスペース一つで区切られていると考えていいのでしょうか?
はい。スペースがあります。
一気に読み込んでしまってメモリ上で組み替えても良いのか?
それともなるべくメモリを使わないようにして処理をする必要があるのか?
出来ればメモリをなるべく使わないように処理をしたいですが、
このソースはファイルを分類するためだけに使用しようと考えています。

本当にいろいろ有難うございます。


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

> 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
みたいになっているという事は「絶対に」ないと思っていていいんですか?


返信引用
中村
 中村
(@中村)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

>各行の列数は揃っていると前提にしていいんですか?例えば、入力が
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までの内容を同じ数のデータで比べようという目的で作っています。

宜しくお願いします。


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

こんな感じでしょうか。エラー処理は省略しています。

入力用のファイルをオープンする。
1行読み込んで何列あるか数える。
列数分、ファイルポインタ型の配列を確保する。

列数分繰り返し・ここから
  出力用ファイル名を生成する。
  出力用ファイルをオープンする。
列数分繰り返し・ここまで

行数分繰り返し・ここから
  入力用ファイルから1行読み込む。
  列数分繰り返し・ここから
    空白文字をデリミタにして、1トークン切り出す。
    切り出したトークンを、然るべき出力用ファイルに出力する。
  列数分繰り返し・ここまで
行数分繰り返し・ここまで

入力用ファイルをクローズする。
列数分繰り返し・ここから
  出力用ファイルをクローズする。
列数分繰り返し・ここまで

> AからFまでの内容を同じ数のデータで比べようという目的で作っています。
> 宜しくお願いします。
なんだか当初の「アドバイスを頂きたい」から「代わりにコーディングして」に変わって
きているような雰囲気を感じてしまったので敢えてCでなく日本語で記述しちゃいまし
た。上記ロジックでは、いきなり2行目から処理してしまわないように注意してください。


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

おっと、ここままではメモリリークしてしまいますね。そこも注意してください。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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