ページ 11

ファイル処理について

Posted: 2016年1月10日(日) 21:31
by ももんが
課題のお手伝いお願いします。
作成したファイルsample.txtを読み込んで別のファイルに書き出す関数プログラムを作る。
ただし、読み込むファイルの名前部分はイニシャル部分(先頭3文字)のみを読み込むこと。

という問題なのですが、ヒントでmain関数でファイルの読み込みと書き込みファイルを指定し、もう一つの関数で指定したファイル(sample.txt)を開き新たなファイルに書き込む。書き込み時にイニシャルに変換しておく。
戻り値は書き込んだ件数を使い、書き込んだ件数を出力させる。
というヒントをもらったのですが、関数を使わずに新たなファイルに書き込む事はできたのですが、イニシャルと書き込んだ件数はどうすれば出てきてくれるのか分かりません。
長文になりましたがお手伝いお願いします。

コード:

 sample.txt
 1990/1/1                   K.Oaaa
  1890/8/9                  I.Aders
  2013/6/9              S.Cgsogaerg
  1679/7/1                  H.Owegr
  509/4/29                    H.Mer
  4000/4/4                   R.Ydfw
  1945/5/3                 D.Hgerwe
  1043/9/9                  K.Ofwga
 1800/2/27                   N.York
  2009/8/4               J.Krenntan

コード:

#include<stdio.h>

int FileInitialCopy(char *InFname, char *OutFname);

int main(void)
{
	FILE *fp, *op;
	char fname[20];
	char i;

	printf("ファイル名:"); scanf("%s", fname); //書き込みファイル指定

	fp = fopen("sample.txt", "r");						//読み込みファイル
	if (fp == NULL){
		printf("ファイルオープンできませんでした。\n");
		return 1;
	}
	else{
		printf("ファイルオープン成功しました。\n");
	}

	op = fopen(fname, "w");								//コピー先

	while ((i = fgetc(fp)) != EOF)
	{
		putchar(i);
		fputc(i, op);
	}
	fclose(fp);
	fclose(op);

	return 0;
}

int FileInitialCopy(char *InFname, char *OutFname)
{

}

Re: ファイル処理について

Posted: 2016年1月10日(日) 22:11
by box
馬鹿げたコードで恐縮です。適当に作り替えてください。

コード:

#include <stdio.h>
#include <string.h>

#define OK (0)
#define NG (!(OK))

int getFilePointer(FILE **fin, FILE **fout)
{
    char file[30];

    if ((*fin = fopen("sample.txt", "r")) == NULL) {
        fprintf(stderr, "read file open error\n");
        return NG;
    }
    printf("file name:"), scanf("%29s", file);
    if ((*fout = fopen(file, "w")) == NULL) {
        fprintf(stderr, "write file open error\n");
        return NG;
    }
    return OK;
}

int readAndWrite(FILE *fin, FILE *fout)
{
    char date[20], name[30], initial[4];
    int count = 0;

    while (fscanf(fin, "%s%s", date, name) == 2) {
        strncpy(initial, name, 3);
        fprintf(fout, "%-12s %s\n", date, initial);
        count++;
    }
    fclose(fin), fclose(fout);
    return count;
}

int main(void)
{
    FILE *fin, *fout;

    if (getFilePointer(&fin, &fout) == NG) {
        fprintf(stderr, "execution failure\n");
        return NG;
    }
    printf("%d records\n", readAndWrite(fin, fout));
    return OK;
}