「row_edit.c」の編集履歴(バックアップ)一覧はこちら
「row_edit.c」(2007/08/02 (木) 09:01:03) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
//c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE_SIZE 256
void execmd(char *txtname, char *temp_cmd);
extern FILE *txtfile;
void one_row_edit(int row, char *txtname){
FILE *shadow; //実際に行を追加していくファイル(あとで元ファイルと入れ替える)
char shadow_name[L_tmpnam]; //一行編集時のデータ保存用
char str[LINE_SIZE]; //行保存用の配列
char c; //shadow→txtfile用
int i; //for用の変数
tmpnam(shadow_name); //一時的ファイルのファイル名の決定
//rowが0以下のとき(atoiが0以外のときこの関数が使われるので出番はないか?)
if(row <= 0){
printf("このコマンドは無効です。\n");
return;
}
shadow = fopen(shadow_name, "w");
//目的の行の手前まで読み込み書き込む
for(i = 1; i < row; i++){
fgets(str, LINE_SIZE - 1, txtfile);
if(ferror(txtfile)){
printf("行読み込みエラー\n");
fclose(shadow);
remove(shadow_name);
return;
}
if(feof(txtfile)){
printf("このコマンドは無効です。\n");
fclose(shadow);
remove(shadow_name);
return;
}
fputs(str, shadow);
}
//行番号と行を表示(\nEOFの並び方はありえない)
if(fgets(str, LINE_SIZE - 1, txtfile) == NULL) strcpy(str, "\n");
if(feof(txtfile)) {
if(strcmp(str, "\n") != 0) printf("%8d: %s\n", row, str);
else{
printf("このコマンドは無効です。\n");
fclose(shadow);
remove(shadow_name);
return;
}
}
else
printf("%8d: %s", row, str);
//新たな行の書き込み
printf("%8d: ", row);
fgets(str, LINE_SIZE - 1, stdin);
fputs(str, shadow);
//終わりまで読み込む(display_allと同じように)
while(!feof(txtfile)){
if(fgets(str, LINE_SIZE - 1, txtfile) == NULL) strcpy(str, "\n");
if(ferror(txtfile)){
printf("行読み込みエラー\n");
return;
}
if(!feof(txtfile)) fputs(str, shadow);
else{
if(strcmp(str, "\n") != 0) fputs(str, shadow);
}
}
//shadow→txtfile
freopen(txtname, "w", txtfile);
freopen(shadow_name, "r", shadow);
while(!feof(shadow)){
c = fgetc(shadow);
if(ferror(shadow)){
fclose(shadow);
printf("一行編集shadow→txtfile読み込みエラー\n");
execmd(txtname, "n\n");
return;
}
if(!feof(shadow)) fputc(c, txtfile);
if(ferror(txtfile)){
fclose(shadow);
printf("一行編集shadow→txtfile書き込みエラー\n");
execmd(txtname, "n\n");
return;
}
}
fclose(shadow);
if(remove(shadow_name) == -1) printf("一行編集shadow削除エラー\n");
return;
}
//行削除
void line_delete(char *txtname)
{
int i , j ;
FILE *shadow;
char c = 1, line[10], str[LINE_SIZE], shadow_name[L_tmpnam] ;
tmpnam(shadow_name);
printf("削除したい行番号を入力して下さい\n");
fgets(line,9,stdin); //削除したい行を入力してもらう
if( atoi(line) < 1 )
{
printf("このコマンドは無効です。\n");
return;
}
shadow = fopen(shadow_name,"w");
for(i=1;c != EOF;i++)
{
if((c = fgetc(txtfile)) == EOF ) //その行の一文字目がEOFなら
{
break ; //終了
}
else if( c == '\n' ) //その行が単なる改行なら
{
j = 0 ;
str[j] = '\n' ; //改行をstrにおさめて
goto input ; //読み込み作業は飛ばす
}
str[0] = c ; //一文字目がEOFでも改行でもなかったら
for(j=1;(c = fgetc(txtfile)) != '\n';j++) //改行するまでその行を読み込む
{
str[j] = c ;
if( c == EOF ) //ファイルの最後が改行せずに終わっていたら
{
goto input; //改行を入れることなく飛ばす
}
}
str[j] = '\n' ; //改行をstrに入れる
input : ;
str[++j] = '\0' ; //最後にNULL文字を入れる
if( i != atoi(line) ) //削除しない行はshadowにコピー
{
fputs(str,shadow);
}
//削除する行はコピーせずに読み飛ばす
}
if( atoi(line) >= i )
{
printf("このコマンドは無効です。\n");
}
txtfile = freopen(txtname,"w",txtfile); //両方のファイルをオープンし直して
shadow = freopen(shadow_name,"r",shadow);
for(;(c = fgetc(shadow)) != EOF;) //shadowの中身をtxtfileにコピー
{
for(;c != '\n' && c != EOF ;c = fgetc(shadow))
{
fputc(c,txtfile);
}
fputc('\n',txtfile);
}
fclose(shadow);
remove(shadow_name);
return;
}
//行挿入
void line_insert(char *txtname)
{
//ほぼ行削除と同じ構造
int i , j ;
FILE *shadow;
char c = 1, line[10], str[LINE_SIZE], shadow_name[L_tmpnam] ;
tmpnam(shadow_name);
fgets(line,9,stdin); //挿入したい行の手前の行を入力してもらう。
if( atoi(line) < 0 )
{
printf("このコマンドは無効です。\n");
return;
}
shadow = fopen(shadow_name,"w");
if( atoi(line) == 0 ) //もし1行目に挿入したい場合は先に入力をする
{
fgets(str,LINE_SIZE,stdin); //挿入する内容を入力
fputs(str,shadow); //それをコピー
} //あとは2行目以降に挿入したい場合と同じ動きをする
for(i=1;c != EOF;i++)
{
if((c = fgetc(txtfile)) == EOF ) //その行の一文字目がEOFなら
{
break ; //終了
}
else if( c == '\n' ) //その行が単なる改行なら
{
j = 0 ;
str[j] = '\n' ; //改行をstrにおさめて
goto input ; //読み込み作業は飛ばす
}
str[0] = c ; //一文字目がEOFでも改行でもなかったら
for(j=1;(c = fgetc(txtfile)) != '\n';j++) //改行するまでその行を読み込む
{
str[j] = c ;
if( c == EOF ) //ファイルの最後が改行せずに終わっていたら
{
goto input; //改行を入れることなく飛ばす
}
}
str[j] = '\n' ; //改行をstrに入れる
input : ;
str[++j] = '\0' ; //最後にNULL文字を入れる
if( i != atoi(line) ) //挿入する手前以外の行は普通にshadowにコピー
{
fputs(str,shadow);
}
else //挿入する手前の行は
{
fputs(str,shadow); //まず手前の行の内容をコピー
fgets(str,LINE_SIZE,stdin); //挿入する内容を入力
fputs(str,shadow); //それをコピー
//通常の動きに戻る
}
}
if( atoi(line) >= i )
{
printf("このコマンドは無効です。\n");
}
txtfile = freopen(txtname,"w",txtfile); //両方のファイルをオープンし直して
shadow = freopen(shadow_name,"r",shadow);
for(;(c = fgetc(shadow)) != EOF;) //shadowの中身をtxtfileにコピー
{
for(;c != '\n' && c != EOF;c = fgetc(shadow))
{
fputc(c,txtfile);
}
fputc('\n',txtfile);
}
fclose(shadow);
remove(shadow_name);
return;
}
//c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE_SIZE 256
void execmd(char *txtname, char *temp_cmd);
extern FILE *txtfile;
void one_row_edit(int row, char *txtname){
FILE *shadow; //実際に行を追加していくファイル(あとで元ファイルと入れ替える)
char shadow_name[L_tmpnam]; //一行編集時のデータ保存用
char str[LINE_SIZE]; //行保存用の配列
char c; //shadow→txtfile用
int i; //for用の変数
tmpnam(shadow_name); //一時的ファイルのファイル名の決定
//rowが0以下のとき(atoiが0以外のときこの関数が使われるので出番はないか?)
if(row <= 0){
printf("このコマンドは無効です。\n");
return;
}
shadow = fopen(shadow_name, "w");
//目的の行の手前まで読み込み書き込む
for(i = 1; i < row; i++){
fgets(str, LINE_SIZE - 1, txtfile);
if(ferror(txtfile)){
printf("行読み込みエラー\n");
fclose(shadow);
remove(shadow_name);
return;
}
if(feof(txtfile)){
printf("このコマンドは無効です。\n");
fclose(shadow);
remove(shadow_name);
return;
}
fputs(str, shadow);
}
//行番号と行を表示(\nEOFの並び方はありえない)
if(fgets(str, LINE_SIZE - 1, txtfile) == NULL) strcpy(str, "\n");
if(feof(txtfile)) {
if(strcmp(str, "\n") != 0) printf("%8d: %s\n", row, str);
else{
printf("このコマンドは無効です。\n");
fclose(shadow);
remove(shadow_name);
return;
}
}
else
printf("%8d: %s", row, str);
//新たな行の書き込み
printf("%8d: ", row);
fgets(str, LINE_SIZE - 1, stdin);
fputs(str, shadow);
//終わりまで読み込む(display_allと同じように)
while(!feof(txtfile)){
if(fgets(str, LINE_SIZE - 1, txtfile) == NULL) strcpy(str, "\n");
if(ferror(txtfile)){
printf("行読み込みエラー\n");
return;
}
if(!feof(txtfile)) fputs(str, shadow);
else{
if(strcmp(str, "\n") != 0) fputs(str, shadow);
}
}
//shadow→txtfile
freopen(txtname, "w", txtfile);
freopen(shadow_name, "r", shadow);
while(!feof(shadow)){
c = fgetc(shadow);
if(ferror(shadow)){
fclose(shadow);
printf("一行編集shadow→txtfile読み込みエラー\n");
execmd(txtname, "n\n");
return;
}
if(!feof(shadow)) fputc(c, txtfile);
if(ferror(txtfile)){
fclose(shadow);
printf("一行編集shadow→txtfile書き込みエラー\n");
execmd(txtname, "n\n");
return;
}
}
fclose(shadow);
if(remove(shadow_name) == -1) printf("一行編集shadow削除エラー\n");
return;
}
//行削除
void line_delete(char *txtname)
{
int i , j ;
FILE *shadow;
char c = 1, line[10], str[LINE_SIZE], shadow_name[L_tmpnam] ;
tmpnam(shadow_name);
printf("削除したい行番号を入力して下さい\n");
fgets(line,9,stdin); //削除したい行を入力してもらう
if( atoi(line) < 1 )
{
printf("このコマンドは無効です。\n");
return;
}
shadow = fopen(shadow_name,"w");
for(i=1;c != EOF;i++)
{
if((c = fgetc(txtfile)) == EOF ) //その行の一文字目がEOFなら
{
break ; //終了
}
else if( c == '\n' ) //その行が単なる改行なら
{
j = 0 ;
str[j] = '\n' ; //改行をstrにおさめて
goto input ; //読み込み作業は飛ばす
}
str[0] = c ; //一文字目がEOFでも改行でもなかったら
for(j=1;(c = fgetc(txtfile)) != '\n';j++) //改行するまでその行を読み込む
{
str[j] = c ;
if( c == EOF ) //ファイルの最後が改行せずに終わっていたら
{
goto input; //改行を入れることなく飛ばす
}
}
str[j] = '\n' ; //改行をstrに入れる
input : ;
str[++j] = '\0' ; //最後にNULL文字を入れる
if( i != atoi(line) ) //削除しない行はshadowにコピー
{
fputs(str,shadow);
}
//削除する行はコピーせずに読み飛ばす
}
if( atoi(line) >= i )
{
printf("このコマンドは無効です。\n");
}
txtfile = freopen(txtname,"w",txtfile); //両方のファイルをオープンし直して
shadow = freopen(shadow_name,"r",shadow);
for(;(c = fgetc(shadow)) != EOF;) //shadowの中身をtxtfileにコピー
{
for(;c != '\n' && c != EOF ;c = fgetc(shadow))
{
fputc(c,txtfile);
}
fputc('\n',txtfile);
}
fclose(shadow);
remove(shadow_name);
return;
}
//行挿入
void line_insert(char *txtname)
{
//ほぼ行削除と同じ構造
int i , j ;
FILE *shadow;
char c = 1, line[10], str[LINE_SIZE], shadow_name[L_tmpnam] ;
tmpnam(shadow_name);
printf("挿入したい行の手前の行番号を入力してください:");
fgets(line,9,stdin); //挿入したい行の手前の行を入力してもらう。
if( atoi(line) < 0 )
{
printf("このコマンドは無効です。\n");
return;
}
shadow = fopen(shadow_name,"w");
if( atoi(line) == 0 ) //もし1行目に挿入したい場合は先に入力をする
{
printf("%8d: ", 1);
fgets(str,LINE_SIZE,stdin); //挿入する内容を入力
fputs(str,shadow); //それをコピー
} //あとは2行目以降に挿入したい場合と同じ動きをする
for(i=1;c != EOF;i++)
{
if((c = fgetc(txtfile)) == EOF ) //その行の一文字目がEOFなら
{
break ; //終了
}
else if( c == '\n' ) //その行が単なる改行なら
{
j = 0 ;
str[j] = '\n' ; //改行をstrにおさめて
goto input ; //読み込み作業は飛ばす
}
str[0] = c ; //一文字目がEOFでも改行でもなかったら
for(j=1;(c = fgetc(txtfile)) != '\n';j++) //改行するまでその行を読み込む
{
str[j] = c ;
if( c == EOF ) //ファイルの最後が改行せずに終わっていたら
{
goto input; //改行を入れることなく飛ばす
}
}
str[j] = '\n' ; //改行をstrに入れる
input : ;
str[++j] = '\0' ; //最後にNULL文字を入れる
if( i != atoi(line) ) //挿入する手前以外の行は普通にshadowにコピー
{
fputs(str,shadow);
}
else //挿入する手前の行は
{
fputs(str,shadow); //まず手前の行の内容をコピー
printf("%8d: ", atoi(line) + 1);
fgets(str,LINE_SIZE,stdin); //挿入する内容を入力
fputs(str,shadow); //それをコピー
//通常の動きに戻る
}
}
if( atoi(line) >= i )
{
printf("このコマンドは無効です。\n");
}
txtfile = freopen(txtname,"w",txtfile); //両方のファイルをオープンし直して
shadow = freopen(shadow_name,"r",shadow);
for(;(c = fgetc(shadow)) != EOF;) //shadowの中身をtxtfileにコピー
{
for(;c != '\n' && c != EOF;c = fgetc(shadow))
{
fputc(c,txtfile);
}
fputc('\n',txtfile);
}
fclose(shadow);
remove(shadow_name);
return;
}