ファイルの取り扱いについて、どのように記述すればいいのかが分かりません。
分からないことが多いので(1)~(4)の質問に分けています、Cの勉強は趣味程度にしかできていないので、詳しくご回答いただけると嬉しいです。
自分なりに書いてみます、間違いがあればご指摘宜しくお願いします。
(1)Aを頭文字にして100個のcsvファイルを作成 (a1,a2…a100)
char A[100]
FILE *fp;
for(i=1;i<101;i++)
{
snprintf(A,sizeof A,"A%d.csv",i);
if((fp = fopen(A,"w"))!=NULL) {exit(1);}
}
(2)A1を開きデータを入れる、この動作を同様に2~100で繰り返す。
A1に入れたいデータはx,y,zで1000行
fp = fopen("A1.csv","a");
for(z=1;z<11;z++)
{
for(y=1;y<11;y++)
{
for(x=1;x<11;x++)
{
fprintf(fp,"%d,%d,%d\n",x,y,z);
}
}
}
fclose(fp);
これでこんな感じに書き込まれるはず・・・
1,1,1
2,1,1
3,1,1
・
・
・
10,10,10
これを同様に2~100のファイルに対して一気に行いたいですが、書き方が分かりません。
(3)再びA1を開きx=10,Y=10の時のzの値を知りたい。
こんな事はできるのでしょうか? もし無理なら~行目のデータを呼び出す
(4)そしてA1を開きx=10,Y=10の時の、zだけを上書き。
長くなってすいません、分からない事だらけなので宜しくお願いします。
No.6ベストアンサー
- 回答日時:
#5 です。
回答プログラムだけで字数制限いっぱいになってしまいました。あなたの質問は「ランダムアクセスの仕方を教えてください。」というものです。
http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3% …
ファイルは、1個作成しようが100個作成しようがやっていることは同じですから、N_FILES の値を好みに応じて変更してください。
プログラムの要点は
#define FORM "%4d,%4d,%4d,%10d\n"
#define FORM_SIZE 26 //一行当たり
と出力形式を改行\nを含めて 26バイトに固定していることです。それによって任意 x,y,z点の値nを参照したり、変更したりできるようになっています。
とりあえず、あなたの希望に答えて、その都度ファイルをオープンするプログラムを
Database sample:
1. Create
2. Input
3. Show
4. Correct
Input number
の表示順(1~4)に入力し、実行してみてください。
各作業毎にホルダー内のCSVファイルを確認すれば、どのような処理がなされているかわかると思います。
その他参照URL
http://www9.plala.or.jp/sgwr-t/c/sec17.html
http://www1.cts.ne.jp/~clab/hsample/File/File06/ …
ご回答ありがとうございます、返事を書くのがすごく遅くなってしまいました。
こう言った操作が有った事を知らなかったので、大変勉強になりました。
本当にありがとうございました。
No.5
- 回答日時:
#include <stdio.h>
#include <stdlib.h> //exit()
#define N_FILES 1
#define X_MAX 3
#define Y_MAX 3
#define Z_MAX 3
#define FORM "%4d,%4d,%4d,%10d\n"
#define FORM_SIZE 26 //一行当たり
void _create(void);
void _input(void);
void _show(void);
void _correct(void);
FILE *open_file(char*,char*);
int main(void)
{
int cmd;
printf("Sample Database:\n");
printf("\t1. Create\n");
printf("\t2. Input\n");
printf("\t3. Show\n");
printf("\t4. Correct\n");
printf("Select one ");
scanf("%d", &cmd);
switch (cmd) {
case 1:
_create();
break;
case 2:
_input();
break;
case 3:
_show();
break;
case 4:
_correct();
break;
default:
printf("Try again.\n");
break;
}
return 0;
}
void _create(void)
{
char file_name[32];
int i;
FILE *fp;
for(i=0;i<N_FILES;i++){
sprintf(file_name,"A%d.csv",i);
if((fp=fopen(file_name,"w"))==NULL){
printf("Can't open %s file.\n", file_name);
exit(1);
}
}
fclose(fp);
}
void _input(void)
{
int x,y,z,n=0;
FILE *fp;
fp=open_file("file name? ", "w+");
for(z=0;z<Z_MAX;z++){
for(y=0;y<Y_MAX;y++){
for(x=0;x<X_MAX;x++){
fprintf(fp,FORM,x,y,z,n++);
}
}
}
fclose(fp);
}
void _show(void)
{
int x,y,z,n,offset;
FILE *fp;
fp=open_file("file name? ","r");
printf("code x,y,z? ");
scanf("%d,%d,%d",&x,&y,&z);
offset=x + Y_MAX*y + X_MAX*Y_MAX*z;
fseek(fp,FORM_SIZE*offset,SEEK_SET);
fscanf(fp,"%d,%d,%d,%d", &x,&y,&z,&n);
printf("dat(%d,%d,%d)= %d\n",x,y,z,n);
fclose(fp);
}
void _correct(void)
{
int x,y,z,n,offset,value;
FILE *fp;
fp=open_file("file name? ","r+");
printf("code x,y,z? ");
scanf("%d,%d,%d",&x,&y,&z);
offset=x+Y_MAX*y+X_MAX*Y_MAX*z;
fseek(fp,FORM_SIZE*offset,SEEK_SET);
fscanf(fp,"%d,%d,%d,%d", &x,&y,&z,&n);
printf("data(%d,%d,%d)= %d ? ",x,y,z,n);
scanf("%d", &value);
fseek(fp,FORM_SIZE*offset+15,SEEK_SET);
fprintf(fp,"%10d\n",value);
fclose(fp);
}
FILE *open_file(char *comment, char *mode)
{
char file_name[32];
FILE *fp;
printf("%s",comment);
scanf("%s",file_name);
if((fp=fopen(file_name,mode))==NULL){
printf("Can't open %s file.\n", file_name);
ext(1);
}
return fp;
}
No.4
- 回答日時:
もとの質問の本筋から大きく外れてしまうが、以下は一般的な話です。
たいていの人は fclose の戻り値の確認を忘れがちですが、fclose の戻り値を必ず確認
すべきです。なぜなら、ファイルへの書き込み処理で実はエラーがあった、ということ
が、ファイルのクローズ時に検出されるということは、ありえるからです。
つまり、ファイルクローズ時に何らかの異常が検出される可能性があるため、それをアプリ
側で補足できる必要があります。
No.3
- 回答日時:
ファイルを作成するまでの方法については、他の方の指摘通りですが、
ファイル出力というのは、挿入処理をすることはではないので
出力する桁数がかわってしまうと内容が壊れてしまいます。
なので、(4)の仕様を実現するために、
出力(fprintf)の時にフォーマットを指定しましょう。("%2d,%2d,%2d\n"とか)
#テキストエディタを上書きモートで編集するつもりになれば感覚はつかめると思います。
# 以下、出力したファイルの内容はソートされていることが前提になりますけれど。。。
(3)については、上記の対応で1行のサイズが固定になるので
行数*(Nバイト+改行)の位置にfseekすればジャンプ(fseek)することは
できるようになります。
ですがまぁ、取得した後の値もつかうでしょうし、
テキスト形式にこだわらなくてもよければ
構造体を利用するのがいいんじゃないでしょうか。
x,y,zの値を持つ構造体を直接ファイル出力することで
ファイルないのどこにほしいデータがあるか計算して直接取得できるようになります。
# sizeof(構造体)*(x*y*z) バイト目
No.2
- 回答日時:
char A[100]
FILE *fp;
for(i=1;i<101;i++)
{
snprintf(A,sizeof A,"A%d.csv",i);
fp = fopen(A,"a");
for(z=1;z<11;z++)
{
for(y=1;y<11;y++)
{
for(x=1;x<11;x++)
{
fprintf(fp,"%d,%d,%d\n",x,y,z);
}
}
}
fclose(fp);
}
No.1
- 回答日時:
1と2を合体させたら
char A[100]
FILE *fp;
int i, x, y, z;
for(i=1;i<101;i++)
{
snprintf(A,sizeof A,"A%d.csv",i);
if((fp = fopen(A,"w"))!=NULL)
{
for(z=1;z<11;z++)
{
for(y=1;y<11;y++)
{
for(x=1;x<11;x++)
{
fprintf(fp,"%d,%d,%d\n",x,y,z);
}
}
}
fclose(fp);
}
}
この回答への補足
なるほど其れもありなんですね…。
でもできれば(1)~(4)を分けて(開いて閉じての動作を分ける)書きたいのですが、どうすれば良いのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Visual Basic(VBA) VBA 毎日取得するデータを順番に反映していく方法 6 2023/08/26 16:22
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) Excelのマクロについて教えてください。 1 2023/03/12 12:16
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Visual Basic(VBA) 顧客ごとに違う点検案内を作成するマクロ 4 2022/09/16 05:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラーがわかりません、、
-
ファイルへの書込み処理が異常...
-
c言語 ファイルから数字を読み...
-
ファイルに行番号を追加
-
c言語でのfscanfについて
-
ガンマ変換 C言語でプログラ...
-
ファイルの特定行の抽出
-
ファイル読み込み EOF 判定
-
Cで文字列の分割
-
2÷3などの余りについて
-
C言語で%を使わない余りの出し方
-
比較回数と交換回数表示について
-
信頼区間の1.96や1.65ってどこ...
-
nCmの関数
-
複数桁10進数の*桁目だけを抽出...
-
Notepad++の関数リスト表示の変...
-
C言語のfor文です。 繰り返しの...
-
break文でループを一気に抜ける...
-
正負を反転させて出力するプロ...
-
#define _CRT_SECURE_NO_WARNIN...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語でのfscanfについて
-
C言語でファイル読み書きを早く...
-
fopenでファイル名に、変数を使...
-
複数ファイルの同時読み込みの...
-
fgets( ) の返り値は何?
-
テキストファイル内に対して, ...
-
ファイルへの書込み処理が異常...
-
C言語にてXMLファイルから任意...
-
ファイル出力で改行を入れたい!
-
C言語でセグメンテーションエ...
-
エラーがわかりません、、
-
ガンマ変換 C言語でプログラ...
-
自己相関関数を求めるプログラ...
-
VisualStudioでのファイルの入...
-
同時にファイル読み込み 書き込み
-
c言語 ファイルから数字を読み...
-
大量の入力ファイルを扱うとき...
-
ファイルが読み込めない・・・
-
【C言語】ファイルを読み込んで...
-
a*(1-exp(-bx))+cの近似の方法
おすすめ情報