ショッピングモール  Personal Health / Men's Health ( Infertility )


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4874

指定したファイルの内容を出力ファイルに書き出す処理
投稿者---コージ(2005/11/20 00:12:06)


始めまして、コージと申します。
C言語を始めて間もないのですが、わからないことがあるので
質問致します。

コマンドパラメータで指定したファイルの最後の5行を、
入力した出力ファイルに書き出すという処理を行いたいのですが、
なかなか作れません。

ファイル内容は、文字列(1行最大256文字)が9行あるものを
使用しています。
もし、コマンドパラメータで指定したファイルが5行未満の場合は、
全部の内容を出力ファイルに書き出します。
指定したファイルが存在しない場合は、エラーとして
プログラムを終了させます。
出力ファイルが存在していた場合は、上書き確認を行い、
上書きしない場合は出力ファイル名を再度入力させるようにします。

どのようにこの処理を書けばよいのでしょうか?
アドバイスをいただければ幸いです。
よろしくお願い致します。

環境
OS:Windows XP
コンパイラ:Borland C++ 5.5


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:指定したファイルの内容を出力ファイルに書き出す処理 4875 まきじ 2005/11/20 00:17:21
<子記事> Re:指定したファイルの内容を出力ファイルに書き出す処理 4876 かずま 2005/11/20 18:25:06


No.4875

Re:指定したファイルの内容を出力ファイルに書き出す処理
投稿者---まきじ(2005/11/20 00:17:21)


>コマンドパラメータで指定したファイルの最後の5行を、
>入力した出力ファイルに書き出す

5 行を配列に記憶しておき、array[0] から array[4] に
繰り返し上書きしていき、最後に array をファイルに
書き込む。


この投稿にコメントする

削除パスワード

No.4877

Re:指定したファイルの内容を出力ファイルに書き出す処理
投稿者---まきじ(2005/11/20 21:21:45)


//gcc -std=iso9899:1999 -pedantic -O2 -Wall

#include<stdio.h>

#define N 5

int main(void){

    FILE *fp=fopen("data.txt","r");
    char lines[N][256]={"\0"};
    int l = 0;
    
    while(fgets(lines[l % N],sizeof(lines[0]),fp)) l++;
    l = l < N ? 0 : l % N;
    for(int k = l + N; lines[l % N][0] && l < k; l++) puts(lines[l % N]);
    
    fclose(fp);
}



この投稿にコメントする

削除パスワード

No.4876

Re:指定したファイルの内容を出力ファイルに書き出す処理
投稿者---かずま(2005/11/20 18:25:06)


> どのようにこの処理を書けばよいのでしょうか?

ファイルの最後から適当なサイズ読み込み、後ろから改行の個数を数える。
ちょっと問題のあるプログラムですが、....。
#include <stdio.h>

#define LINES  5

int main(int argc, char *argv[])
{
    FILE *fp;  char buf[2048], *p;  int n, i, k = 0;

    if (argc != 2) return printf("usage: %s file\n", argv[0]), 1;
    fp = fopen(argv[1], "rb");
    if (!fp) return printf("can't open %s\n", argv[1]), 1;
    fseek(fp, -(long)sizeof(buf), SEEK_END);
    n = fread(buf, 1, sizeof(buf), fp);
    fclose(fp);
    for (i = n; i > 0; i--)
        if (buf[i-1] == '\n' && ++k > LINES) break;
    fwrite(buf + i, 1, n - i, stdout);
    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity