C言語関係掲示板

過去ログ

No734 検索した文字列の一つ上の文字列を出力したい

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

文字列の処理
投稿者---とう(2003/08/22 16:39:45)


はじめましてとうと申します
今文字列の処理に関して非常に悩んでいます(初心者なので)
ファイルから文字列を検索し出力するところまではできたのですが
検索した文字列の一つ上の文字列を出力したいのですが
どうしたらいいのでしょうか?
ご回答よろしくおねがいします。

No.9016

Re:文字列の処理
投稿者---たいちう(2003/08/22 17:06:55)


>検索した文字列の一つ上の文字列を出力したいのですが

具体例をお願いします。

No.9018

Re:文字列の処理
投稿者---nop(2003/08/22 17:18:33)


>検索した文字列の一つ上の文字列を出力したいのですが
>どうしたらいいのでしょうか?

「一つ上」の定義は?

No.9019

Re:文字列の処理
投稿者---たか(2003/08/22 17:25:52)


まあこんな物でしょうか。
当然一行目に発見された場合は何も表示せずに終了します。

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

int main(void)
{
  FILE *fp;
  long ft;
  char buf[128], *str = "ewc"; /* 検索する文字列 */
  int i;
  
  if ((fp = fopen("name.dat", "r")) == NULL) exit(1);

  while (1) {
    fgets(buf, 128, fp);
    if (feof(fp)) goto end;
    ft = ftell(fp);
    if (strstr(buf, str)) break;
  }

  fseek(fp, ft, SEEK_SET);
  
  while (1) {
    if (fseek(fp, --ft, SEEK_SET)) goto end;
    i = fgetc(fp);
    if (i == '\n') break;
  }

  fseek(fp, --ft, SEEK_SET);

  while (1) {
    if (fseek(fp, --ft, SEEK_SET)) goto end;
    i = fgetc(fp);
    if (i == '\n') break;
  }

  fseek(fp, --ft, SEEK_SET);

  while (1) {
    if (fseek(fp, --ft, SEEK_SET)) {
      fseek(fp, ++ft, SEEK_SET);
      break;
    }
    i = fgetc(fp);
    if (i == '\n') break;
  }
  
  fgets(buf, 128, fp);
  printf("一行前の行 = %s", buf);
  
end:  
  return 0;
}


No.9020

Re:文字列の処理
投稿者---物見遊山(2003/08/22 18:56:31)


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

int
main(int argc, char *argv[])
{
    char buf[2][BUFSIZ] = { {'\0', }, };
    int i;
    int ret = 1;

    if (argc != 2) goto end;

    for (i = 0; NULL != fgets(buf[i], sizeof buf[i], stdin); i ^= 1)
        if (NULL != strstr(buf[i], argv[1])) {
            int j = i ^ 1;
            printf("%s", buf[j]);
        }

    ret = 0;
end:
    return ret;
}


No.9021

Re:文字列の処理
投稿者---たか(2003/08/22 19:21:48)


なるほど、ダブルバッファにしておき切り替えるのか。ゲームのような
技法ですね。お見事。

No.9061

Re:文字列の処理
投稿者---とう(2003/08/26 13:12:38)


ありがとうございました。
参考になりました。
また機会がありましたらよろしくおねがいします。