2

ファイルを読み取って、すべての文字を対応する ASCII テーブルの 1 つ上の文字に置き換えようとしています。ファイルを適切に開きますが、最初の文字を読み続けます。

int main(int argc, char * argv[])
{
    FILE *input;
    input = fopen(argv[2], "r+");
    if (!input)
    {
        fprintf(stderr, "Unable to open file %s", argv[2]);
        return -1;
    }

    char ch;
    fpos_t * pos;
    while( (ch = fgetc(input)) != EOF)
    {
            printf("%c\n",ch);
            fgetpos (input, pos);
            fsetpos(input, pos-1);
            fputc(ch+1, input);
    }
    fclose(input);
    return 1;
}

テキストファイルは

abc
def
ghi

fgetpos と fsetpos が原因だと確信していますが、それを削除すると、ファイルの最後に文字が追加され、次の fgetc は EOF を返して終了します。

4

5 に答える 5

2

などのランダム アクセスを実行するための手順

  1. レコードを配置しました
  2. レコードの読み取り
  3. レコードを配置しました
  4. レコードを更新 (書き込み)
  5. フラッシュを行う(更新を完了するため)

以下のコードはそれを考慮して書き直したものです。

#include <stdio.h>
#include <ctype.h>

int main(int argc, char * argv[]){
    FILE *input;
    input = fopen(argv[1], "rb+");
    if (!input){
        fprintf(stderr, "Unable to open file %s", argv[1]);
        return -1;
    }

    int ch;
    fpos_t pos, pos_end;
    fgetpos(input, &pos);
    fseek(input, 0L, SEEK_END);
    fgetpos(input, &pos_end);
    rewind(input);
    while(pos != pos_end){
        ch=fgetc(input);
        if(EOF==ch)break;
        printf("%c",ch);
        if(!iscntrl(ch) && !iscntrl(ch+1)){
            fsetpos(input, &pos);
            fputc(ch+1, input);
            fflush(input);
        }
        pos += 1;
        fsetpos(input, &pos);
    }
    fclose(input);
    return 1;
}
于 2013-04-27T18:35:39.700 に答える
1

更新モード ('+') は、扱いが少し難しい場合があります。たぶん、アプローチを変更してファイル全体をchar配列にロードし、それを繰り返し処理してから、最終的にすべてを空の入力ファイルに書き込むことができますか? ストリームの問題はありません。

于 2013-04-27T17:01:15.617 に答える