「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; }

表示オプション

横に並べて表示:
変化行の前後のみ表示: