C言語入門/ファイルの入出力2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
''[[FrontPage]]''
* ファイルの入出力2 [#ya50b151]
UNIX上でテキストファイルのコピーを行う実験プログラム。
** 制約 [#g3826ebb]
コピーするのに1行単位、または1文字単位で読書きするよう...
移植性を高めるためにシステムコールは使用禁止とする。~
~
システムコール以外のファイルサイズ取得にstat()があるが、s...
~
さらによい方法が見つかれば更新します。
#include <stdio.h> /* ...
#include <sys/stat.h> /* for s...
/*#include <sys/types.h> for s...
/*#include <unistd.h> for s...
#include <string.h> /* for s...
#include <stdlib.h> /* for m...
/* ...
#define MAX_F_NAME 40 /* ...
#define INDEX_OK 0 /* ...
#define RET_OK 0 /* ...
#define RET_NG -1 /* ...
#define FILE_NG -2 /* ...
/* ...
int main(void) /* ...
{ /* ...
FILE *fin; /* 入力...
FILE *fout; /* 出力...
int index = INDEX_OK; /* 異常...
int rtnCode = RET_OK; /* リタ...
char fileName[MAX_F_NAME] = ""; /* ファ...
char *desk; /* メモ...
char ans[3] = ""; /* 継続...
char spew = '\0'; /* stdin...
struct stat st; /* for s...
/* ...
while(1) /* 無限...
{ /* ...
printf("コピー元ファイル名 > "); /* 画面...
fgets(fileName, MAX_F_NAME, stdin); /* 入力...
if(!strchr(fileName, '\n')) /* 入力...
{ /* 入力...
while(spew != '\n') /* stdin...
{ /* ...
spew = fgetc(stdin); /* ...
} /* ...
spew = '\0'; /* ...
} /* ...
/* ...
fileName[strlen(fileName) - 1] = '\0'; /* 末尾...
index = stat(fileName, &st); /* シス...
if(INDEX_OK != index) /* 異常...
{ /* ...
printf("statまたは入力のエラー\n"); /* 画面...
rtnCode = RET_NG; /* リタ...
break; /* 処理...
} /* ...
/* ...
desk = (char*)malloc(st.st_size); /* 作業...
if(NULL == desk) /* 異常...
{ /* ...
printf("mallocでエラー\n"); /* 画面...
rtnCode = RET_NG; /* リタ...
break; /* 処理...
} /* ...
/* free(desk);*/ /* * fre...
/* ...
fin = fopen(fileName, "rb"); /* 入力...
if(NULL == fin) /* 異常...
{ /* ...
printf("fopenでエラー(入力元)\n"); /* 画面...
rtnCode = FILE_NG; /* リタ...
break; /* 処理...
} /* ...
/* ...
/* fgets(desk, st.st_size, fin); * バ...
fread(desk, sizeof(char), st.st_size, fin); /* ...
fclose(fin); /* 入力...
/* free(desk);*/ /* * fre...
/* ...
printf("コピー先ファイル名 > "); /* 画面...
fgets(fileName, MAX_F_NAME, stdin); /* 出力...
if(!strchr(fileName, '\n')) /* 入力...
{ /* 入力...
while(spew != '\n') /* stdin...
{ /* ...
spew = fgetc(stdin); /* ...
} /* ...
spew = '\0'; /* ...
} /* ...
/* ...
fileName[strlen(fileName) - 1] = '\0'; /* 末尾...
fout = fopen(fileName, "ab"); /* 出力...
if(NULL == fout) /* 異常...
{ /* ...
printf("fopenでエラー(出力先)\n"); /* 画面...
rtnCode = FILE_NG; /* リタ...
break; /* 処理...
} /* ...
/* ...
/* fputs(desk, fout); * バ...
fwrite(desk, sizeof(char), st.st_size, fout); /*...
fclose(fout); /* 出力...
free(desk); /* * fre...
/* ...
printf("コピー成功したかも。まだやる?[Y/n] > ")...
fgets(ans, 2, stdin); /* 継続...
if(!strchr(ans, '\n')) /* 入力...
{ /* 入力...
while(spew != '\n') /* stdin...
{ /* ...
spew = fgetc(stdin); /* ...
} /* ...
spew = '\0'; /* ...
} /* ...
/* ...
if((ans[0] == 'n' || ans[0] == 'N') && (ans[1] =...
{ /* 継続...
printf("正常終了\n"); /* 画面...
break; /* 処理...
} /* ...
} /* ...
/* ...
return (rtnCode); /* ...
}
*** 修正履歴 [#tad8719c]
Borlandには"unistd.h", "getopt.h"が存在しないため、Maxima...
取得したファイルサイズを引数としてfread,fwriteを呼出し、...
~
*** 課題 [#v760a770]
+バイナリでなくテキストモードで同じことをすると、ファイル...
+コンパイル時にfopen_sを使うように警告が出る。
+mallocの仕様をよく理解していないので、free()するベストの...
~
暇があればこれらについても調べてみます。~
~
1.について、Unix環境ではバイナリでの処理が基本のため、モ...
2.コンパイラによって出たり出なかったり。~
3.誰か教えて。~
~
-備考~
ファイルロックは自分で実装してください。
終了行:
''[[FrontPage]]''
* ファイルの入出力2 [#ya50b151]
UNIX上でテキストファイルのコピーを行う実験プログラム。
** 制約 [#g3826ebb]
コピーするのに1行単位、または1文字単位で読書きするよう...
移植性を高めるためにシステムコールは使用禁止とする。~
~
システムコール以外のファイルサイズ取得にstat()があるが、s...
~
さらによい方法が見つかれば更新します。
#include <stdio.h> /* ...
#include <sys/stat.h> /* for s...
/*#include <sys/types.h> for s...
/*#include <unistd.h> for s...
#include <string.h> /* for s...
#include <stdlib.h> /* for m...
/* ...
#define MAX_F_NAME 40 /* ...
#define INDEX_OK 0 /* ...
#define RET_OK 0 /* ...
#define RET_NG -1 /* ...
#define FILE_NG -2 /* ...
/* ...
int main(void) /* ...
{ /* ...
FILE *fin; /* 入力...
FILE *fout; /* 出力...
int index = INDEX_OK; /* 異常...
int rtnCode = RET_OK; /* リタ...
char fileName[MAX_F_NAME] = ""; /* ファ...
char *desk; /* メモ...
char ans[3] = ""; /* 継続...
char spew = '\0'; /* stdin...
struct stat st; /* for s...
/* ...
while(1) /* 無限...
{ /* ...
printf("コピー元ファイル名 > "); /* 画面...
fgets(fileName, MAX_F_NAME, stdin); /* 入力...
if(!strchr(fileName, '\n')) /* 入力...
{ /* 入力...
while(spew != '\n') /* stdin...
{ /* ...
spew = fgetc(stdin); /* ...
} /* ...
spew = '\0'; /* ...
} /* ...
/* ...
fileName[strlen(fileName) - 1] = '\0'; /* 末尾...
index = stat(fileName, &st); /* シス...
if(INDEX_OK != index) /* 異常...
{ /* ...
printf("statまたは入力のエラー\n"); /* 画面...
rtnCode = RET_NG; /* リタ...
break; /* 処理...
} /* ...
/* ...
desk = (char*)malloc(st.st_size); /* 作業...
if(NULL == desk) /* 異常...
{ /* ...
printf("mallocでエラー\n"); /* 画面...
rtnCode = RET_NG; /* リタ...
break; /* 処理...
} /* ...
/* free(desk);*/ /* * fre...
/* ...
fin = fopen(fileName, "rb"); /* 入力...
if(NULL == fin) /* 異常...
{ /* ...
printf("fopenでエラー(入力元)\n"); /* 画面...
rtnCode = FILE_NG; /* リタ...
break; /* 処理...
} /* ...
/* ...
/* fgets(desk, st.st_size, fin); * バ...
fread(desk, sizeof(char), st.st_size, fin); /* ...
fclose(fin); /* 入力...
/* free(desk);*/ /* * fre...
/* ...
printf("コピー先ファイル名 > "); /* 画面...
fgets(fileName, MAX_F_NAME, stdin); /* 出力...
if(!strchr(fileName, '\n')) /* 入力...
{ /* 入力...
while(spew != '\n') /* stdin...
{ /* ...
spew = fgetc(stdin); /* ...
} /* ...
spew = '\0'; /* ...
} /* ...
/* ...
fileName[strlen(fileName) - 1] = '\0'; /* 末尾...
fout = fopen(fileName, "ab"); /* 出力...
if(NULL == fout) /* 異常...
{ /* ...
printf("fopenでエラー(出力先)\n"); /* 画面...
rtnCode = FILE_NG; /* リタ...
break; /* 処理...
} /* ...
/* ...
/* fputs(desk, fout); * バ...
fwrite(desk, sizeof(char), st.st_size, fout); /*...
fclose(fout); /* 出力...
free(desk); /* * fre...
/* ...
printf("コピー成功したかも。まだやる?[Y/n] > ")...
fgets(ans, 2, stdin); /* 継続...
if(!strchr(ans, '\n')) /* 入力...
{ /* 入力...
while(spew != '\n') /* stdin...
{ /* ...
spew = fgetc(stdin); /* ...
} /* ...
spew = '\0'; /* ...
} /* ...
/* ...
if((ans[0] == 'n' || ans[0] == 'N') && (ans[1] =...
{ /* 継続...
printf("正常終了\n"); /* 画面...
break; /* 処理...
} /* ...
} /* ...
/* ...
return (rtnCode); /* ...
}
*** 修正履歴 [#tad8719c]
Borlandには"unistd.h", "getopt.h"が存在しないため、Maxima...
取得したファイルサイズを引数としてfread,fwriteを呼出し、...
~
*** 課題 [#v760a770]
+バイナリでなくテキストモードで同じことをすると、ファイル...
+コンパイル時にfopen_sを使うように警告が出る。
+mallocの仕様をよく理解していないので、free()するベストの...
~
暇があればこれらについても調べてみます。~
~
1.について、Unix環境ではバイナリでの処理が基本のため、モ...
2.コンパイラによって出たり出なかったり。~
3.誰か教えて。~
~
-備考~
ファイルロックは自分で実装してください。
ページ名: