※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

//行挿入
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;
}