C言語関係掲示板

過去ログ

No.534.行を逆順に出力したファイルの作成

[戻る] [ホームページ]
No.4348

行を逆順に出力したファイルの作成のやり方教えて下さい。
投稿者---こころ(2003/01/14 11:46:26)


C言語です。
いろいろやってみたんですがどうしてもわからないです。
入力、出力などはわかるんですが、どうやって逆順にするかという重要な部分が分からないです。
誰か教えて下さい。
お願いします。
私の考えでは、改行文字で行の先頭に戻ってという形で繰り返して出力していくのかなと思うのですが…。

No.4352

Re:行を逆順に出力したファイルの作成のやり方教えて下さい。
投稿者---Zeel(2003/01/14 15:13:37)


ぽいんたがたの、はいれつをせんげんして、
ぎょうのせんとうのあどれすをはいれつにじゅんばんにいれていって、
うしろからしゅつりょくしてhairetu[0]をしゅつりょくしておわってみては?

No.4355

Re:行を逆順に出力したファイルの作成のやり方教えて下さい。
投稿者---たか(2003/01/14 16:06:20)


ざっと作ったので間違いがあるかもしれませんが、取り敢えず
動きます。

#include <stdio.h>
#include <stdlib.h>

#define BUFLEN 1024

int main(int argc, char *argv[])
{
  FILE *fi;
  long *ptr;
  char buf[BUFLEN];
  int i, lc = 0;
  
  if (argc < 2 || (fi = fopen(argv[1], "r")) == NULL)
    exit(1);
  
  while (fgets(buf, BUFLEN, fi)) lc++;
  rewind(fi);
  
  if ((ptr = (long *)malloc(lc * sizeof(long))) == NULL)
    exit(1);
  
  for (i = 0; i < lc; i++) {
    ptr[i] = ftell(fi);
    fgets(buf, BUFLEN, fi);
  }
  
  for (i = lc - 1; i >= 0; i--) {
    fseek(fi, ptr[i], SEEK_SET);
    fgets(buf, BUFLEN, fi);
    printf(buf);
  }
  
  free(ptr);
  return 0;
}


No.4356

Re:行を逆順に出力したファイルの作成のやり方教えて下さい。
投稿者---たか(2003/01/14 16:08:27)


あっやっぱり間違いが。
fclose(fi);をfree(ptr);の前あたりに入れて下さい。

No.4357

Re:行を逆順に出力したファイルの作成のやり方教えて下さい。
投稿者---こころ(2003/01/14 16:12:14)


ありがとうございます。参考にして考えてやってみます。

No.4358

Re:行を逆順に出力したファイルの作成のやり方教えて下さい。
投稿者---たか(2003/01/14 16:15:09)


よくよく考えるとbufの中に"%"文字が含まれていると、printfの出力
がおかしくなるので、
printf("%s", buf); の方がいいですね。

No.4360

Re:行を逆順に出力したファイルの作成のやり方教えて下さい。
投稿者---こころ(2003/01/14 16:52:02)


while(FOREVER)文で文字をひとつひとつ出力してやるやり方ではできないですか?まだ初心者で、さっきのやり方では習ってないことが多すぎて自分の考えれる範囲で作りたいんですが…。
教えて下さる方、お願いします。

No.4369

Re:行を逆順に出力したファイルの作成のやり方教えて下さい。
投稿者---たか(2003/01/14 23:35:19)


まあ特に気にしていませんけど・・・・・

ftell()とfseek()を使わないプログラムを書いてみました。ファイルの
内容を全部一度読み込むので、それだけのメモリが必要です。と言って
も最近の処理系はメモリ不足はあまり気にしなくてよくなってますね。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFLEN 1024

int main(int argc, char *argv[])
{
  FILE *fi;
  char **ptr;
  char buf[BUFLEN];
  int i, lc = 0;
  
  if (argc < 2 || (fi = fopen(argv[1], "r")) == NULL)
    exit(1);
  
  while (fgets(buf, BUFLEN, fi)) lc++;
  rewind(fi);
  
  if ((ptr = (char **)malloc(lc * sizeof(char *))) == NULL)
    exit(1);
  
  for (i = 0; i < lc; i++) {
    fgets(buf, BUFLEN, fi);
    if ((ptr[i] = (char *)malloc(strlen(buf) + 1)) == NULL)
      exit(1);
    strcpy(ptr[i], buf);
  }
  fclose(fi);
  
  if (lc)
    for (i = lc - 1; i >= 0; i--) {
      printf("%s", ptr[i]);
      free(ptr[i]);
    }
  
  free(ptr);
  return 0;
}


No.4374

Re:行を逆順に出力したファイルの作成のやり方教えて下さい。
投稿者---こころ(2003/01/15 00:38:55)


いろいろご迷惑おかけいたしました。
本当に最近勉強はじめたばかりの初心者です。
参考書を一つしか持っておらず、これはその応用の演習の一つなんですが,
どうやっても参考書の範囲内でできず苦悩しています。
いろいろ忙しく、時間の空く投稿お詫び申し上げます。
ソースの方なんですが、インターネット環境のないコンピュータでつくっているものですからコピーすることができず、時間の関係上省きました。礼儀がなくすみませんでした。
ソースファイル貼付けます。
:の部分を変えて作りたいんですが可能でしょうか?
これぐらいのことしかまだやっていません。
<pre>#include&lt;stdio.h&gt;
#define FOREVER 1

main()
{
  char in_name[100];
  char out_name[100];
  FILE *inp_file;
  FILE *out_file;
  char moji;


  printf(&quot;行を逆順にしたいファイル名を入力して下さい。&gt;&gt; &quot;);
  scanf(&quot;%s&quot;,in_name);
  inp_file = fopen(in_name,&quot;r&quot;);
  if(inp_file == NULL){
    printf(&quot;%sというファイルは存在しません。&quot;in_name);
    exit(0);
  }

  getchar();
  printf(&quot;出力するファイル名を入力して下さい。&gt;&gt; &quot;);
  scanf(&quot;%s&quot;,out_name);
  out_file = fopen(out_name,&quot;w&quot;);
  if(out_file == NULL){
    printf(&quot;エラー:ファイルが開けませんでした。\n&quot;,out_name);
    exit(0);
 }

  while(FOREVER){
    moji = fgetc(inp_file);
  if(moji == EOF)
    break;
  if(moji == '\n')
    :
  :
  fputc(moji,out_file);
}

  fclose(inp_file);
  fclose(out_file);
  exit(0);
}
  </pre>


No.4436

Re:行を逆順に出力したファイルの作成のやり方教えて下さい。
投稿者---かずま(2003/01/17 21:07:34)


> ftell()とfseek()を使わないプログラムを書いてみました。ファイルの
> 内容を全部一度読み込むので、それだけのメモリが必要です。と言って
> も最近の処理系はメモリ不足はあまり気にしなくてよくなってますね。

ファイルの内容を全部メモリに読み込むのでよければ、こんなふうにも書けます。
#include <stdio.h>
#include <string.h>

FILE *fp;  char buf[1024];

void reverse(void)
{
    if (fgets(buf, sizeof buf, fp)) {
        char *p = strdup(buf);
        reverse();
        fputs(p, stdout);
    }
}

int main(int argc, char *argv[])
{
    if (argc > 1 && (fp = fopen(argv[1], "r")))
        reverse();
    return 0;
}


No.4439

Re:行を逆順に出力したファイルの作成のやり方教えて下さい。
投稿者---かずま(2003/01/17 21:57:18)


> ファイルの内容を全部メモリに読み込むのでよければ、こんなふうにも書けます。

先頭に、#include <stdlib.h> を、
char *p = strdup(buf); の次に
if (p == NULL) puts("out of memory"), exit(1); を
追加してください。