掲示板利用宣言

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

 私は

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

掲示板2

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

No.23968

一度、入出力処理を行ったあとのファイル操作について
投稿者---ふく(2005/11/04 16:41:14)


お世話になります。
ファイル(aファイル)を読みとって新しいファイル(bファイル)として出力したあとに
もう一度そのbファイルを操作しようと試みているのですが
なかなかうまく行きません
fopen 関数の説明を読むと
「更新モードでオープン('+'がmodeの2番目または3番目の文字である場合)されたファイルに結び付けられた
ストリームに対しては、入力操作と出力操作を許す。ただし、出力操作の後に入力操作を行う場合、この二つの操作の間にファイル位置付け関数(fseek、fsetposもしくはrewind)を呼び出さなければならない。」
とあったので rewind 関数を使って、ファイル位置表示子を先頭にしてみたのですが、うまく動作しません。(していない気がします)
以下、ソースを載せてみますのでよろしくお願いします。
#include <stdio.h>
#include <string.h>

void func1(FILE* fin, FILE* fout);            //EOS(改行文字)を取る


int main(void)
{
    FILE* fin;
    FILE* fout;

    char infile[64];
    char outfile[64];

    printf("INファイル名-->");
    scanf("%s", infile);
    fin = fopen(infile, "r");
    if(fin == NULL){
        printf("ファイルがありません\n");
        return 1;
    }
    printf("OUTファイル名-->");
    scanf("%s", outfile);
    fout = fopen(outfile, "w+");
    func1(fin, fout);

    fclose(fin);
    fclose(fout);
    return 0;
}
/*形態素解析結果からEOSを省く処理*/
void func1(FILE* fin, FILE* fout)
{
    char temp1[64];
    char temp2[64];
    char temp3[64];

    while(fscanf(fin, "%s", temp3) != EOF){
    if(!strcmp(temp3, "EOS")) 
        continue;
    else
    fprintf(fout, "%s  ", temp3);
    }

    rewind(fout);       //ファイル位置表示子を先頭に戻してるつもり


/*EOSを除いた文書から必要な品詞を取り出す*/

    while(fscanf(fout, "%s%s", temp1, temp2) == 2){
    if(!strncmp(temp2, "名詞", 2) || !strncmp(temp2, "形容詞", 3))
        fprintf(fout, "%s ", temp1);
    if(!strncmp(temp2, "動詞", 2))
        fprintf(fout, "%s", temp1);
    }
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:一度、入出力処理を行ったあとのファイル操作について 23969 ふく 2005/11/04 16:46:40


No.23969

Re:一度、入出力処理を行ったあとのファイル操作について
投稿者---ふく(2005/11/04 16:46:40)


>とあったので rewind 関数を使って、ファイル位置表示子を先頭にしてみ>たのですが、うまく動作しません。(していない気がします)

自己レスすいません(補足)
うまく動作していない気がする というのは
bファイル と「必要な品詞を取り出す」という処理を
行った後のbファイルの内容が同じであるからです



この投稿にコメントする

削除パスワード

No.23970

Re:一度、入出力処理を行ったあとのファイル操作について
投稿者---RAPT(2005/11/04 17:06:31)


文字コードは何をお使いですか?
仮にShiftJISコードと仮定すると、

> !strncmp(temp2, "名詞", 2)
これは temp2の先頭2バイトが "名" である時、真となりますが、
想定したとおりの動作でしょうか。

> !strncmp(temp2, "形容詞", 3)
これも、 temp2の先頭3バイトが "形" と "容"の1バイト目 である時、
真となりますが、想定したとおりの動作でしょうか。


データファイルの仕様が不明なので確実ではありませんが、
> fscanf(fout, "%s%s", temp1, temp2)
これは想定したとおりの動作をするでしょうか。

まずは上記のコードが想定したとおりの動作をするか検証してみては?



この投稿にコメントする

削除パスワード

No.23972

Re:一度、入出力処理を行ったあとのファイル操作について
投稿者---ふく(2005/11/04 20:19:45)


RAPT様
ご指摘ありがとうございます

>文字コードは何をお使いですか?

日本語入力ソフトを確認したところ、シフトJISと思われます
あと、Microsoft VC++を使用しています
VC++上でどの文字コードが動作しているのかは、調べ方が分からなかったです

>これは temp2の先頭2バイトが "名" である時、真となりますが、
想定したとおりの動作でしょうか。

日本語は2バイトで1文字なのをすっかり忘れていました
該当個所は修正し、簡単なテストプログラムでも確認済みです

>データファイルの仕様が不明なので確実ではありませんが、
fscanf(fout, "%s%s", temp1, temp2)
これは想定したとおりの動作をするでしょうか。

入力、出力ファイルは共に拡張子 txt のテキスト文書です
ご指摘の fscanf(fout, "%s%s", temp1, temp2) の部分は
簡単なテストプログラムで動くことが確認済みです
ファイルから文字列を2つ取ってきて それぞれ temp1 temp2 に格納する



この投稿にコメントする

削除パスワード

No.23973

Re:一度、入出力処理を行ったあとのファイル操作について
投稿者---ふく(2005/11/04 23:09:17)


自己完結です
ありがとうございました


この投稿にコメントする

削除パスワード

No.23976

Re:一度、入出力処理を行ったあとのファイル操作について
投稿者---RAPT(2005/11/05 00:37:35)


VC++であれば、文字コードはShiftJISかUnicodeになります。

char* astr = "aaa"; // shift_jis
wchar_t* wstr = L"bbb"; // unicode
LPTSTR tstr = _T("ccc"); // _T ルーチンについて調べてみてください。

>自己完結です
>ありがとうございました
え?

で、結局原因は何でしたか?
解決したのであれば、何が原因だったか書いてみてください。
# 自己解決、ね。自己完結だと困っちゃう



この投稿にコメントする

削除パスワード

No.23979

Re:一度、入出力処理を行ったあとのファイル操作について
投稿者---ふく(2005/11/05 08:47:50)


>RAPT様
アドバイスありがとうございます
自己解決ですね^^;
すいません

原因、というかどのように解決したのかと言いますと
単純にプログラムを分けました
関数化したとかじゃなくて、手間がかかりますが二つのプログラムを
実行しようと決めたからです。
test.c a.txt b.txt  1回目
test_1.c b.txt c.txt 2回目
としました

知らない関数(rewind や fsetposなど)を使ってみようと試みましたが
まだまだ私には荷が重いようです

自分なりに考えて、それでも分からないから投稿させていただきましたが
自己解決となり、ひんしゅくを買われている方もいるかと思いますが、
これからもよろしくお願いしたします



この投稿にコメントする

削除パスワード

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