//行挿入
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("挿入したい行番号を入力して下さい\n");
fgets(line,9,stdin); //挿入したい行を入力してもらう。
if( atoi(line) <= 0 )
{
printf("行番号が不正です。\n");
return;
}
shadow = fopen(shadow_name,"w");
if( atoi(line) == 1 ) //もし1行目に挿入したい場合は先に入力をする
{
printf("挿入したい文章を入力して下さい\n");
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) -1 ) //挿入する手前以外の行は普通にshadowにコピー
{
fputs(str,shadow);
}
else //挿入する手前の行は
{
fputs(str,shadow); //まず手前の行の内容をコピー
printf("挿入したい文章を入力して下さい\n");
printf("%8d: ", atoi(line));
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;
}
最終更新:2007年08月03日 00:24