3

ファイルの読み取りと書き込みを同時に行おうとしており、text.txt の内容のすべてのタブをスペースに置き換えようとしています。これは私のコードです:

int main()
{
   FILE* filePtr = fopen("text.txt", "w+");

   char c;
   c = fgetc(filePtr);
   fpos_t num;
   while(c != EOF)
   {
       if(c == '\t')
       {
           fgetpos(filePtr, &num);
           num--;
           fsetpos(filePtr, &num);
           fputc(' ', filePtr);
       }
       c = fgetc(filePtr);
   }
}

text.txt の内容は次のとおりです。

こんにちは \t 私の \t 名前は \t ジャックです!

このコードを実行すると、text.txt ファイルの出力は空白になります。そこにはキャラクターはいません。置換が意図したとおりに機能するようにするにはどうすればよいですか?

4

4 に答える 4

8

コードには 3 つの主な問題があります。

  1. モードでファイルを開くと、ファイルが"w+" 切り捨てられます (すべての内容が削除されます)。読み取りと書き込みの両方が可能ですが、元の内容は失われます。モード"r+"は、内容を変更せずに読み書き用にファイルを開き、最初はファイルの位置をファイルの先頭にします。

  2. type の値に対して算術演算を実行するのは安全ではありませんfpos_t。とにかく不必要です。ファイルの位置を相対的に移動する簡単な方法があります。

  3. 完了時にファイルを閉じません。

あなたのコードのこのバリエーションは私にとってはうまくいきます:

#include <stdio.h>

int main(void)
{
   FILE* filePtr = fopen("text.txt", "r+");
   char c;

   while((c = fgetc(filePtr)) != EOF)
   {
       if(c == '\t')
       {
           fseek(filePtr, -1, SEEK_CUR);
           fputc(' ', filePtr);
       }
   }
   fclose(filePtr);
   return 0;
}
于 2015-04-16T14:58:19.907 に答える
2

cplusplus.comを引用すると、

"w+" write/update: 空のファイルを作成し、更新用に開きます (入力と出力の両方)。同じ名前のファイルが既に存在する場合、その内容は破棄され、そのファイルは新しい空のファイルとして扱われます。

「r+」を使用する必要があります。

"r+" read/update: ファイルを更新用に開きます (入力と出力の両方)。ファイルが存在する必要があります。

于 2015-04-16T14:32:23.240 に答える
1

ここのコードには 2 つの主な問題があります。

  1. ここでは、「w+」の代わりに「r+」モードを使用する必要があります。

「w+」モードは、ファイルが前から終了してからファイルに書き込むと、ファイルのすべての内容を削除しますが、「r+」モードでは、前の現在のデータを使用できます。

  1. 読み取りから書き込みへ、または書き込みから読み取りへデータを切り替える場合は、位置設定機能を使用する必要があります。

Pelles C ヘルプ ファイルから:

ファイルが更新モード (mode 引数の 2 番目または 3 番目の文字として「+」) で開かれると、関連付けられたストリームで入力と出力の両方が実行される場合があります。ただし、fflush 関数またはファイル配置関数 (fseek、fsetpos、または巻き戻し) への呼び出しを介在させずに、出力の直後に入力を続けてはならず、ファイル配置への呼び出しを介在させずに、入力の直後に出力を続けてはなりません。入力操作がファイルの終わりに達しない限り、機能します。

これは私のために働いたコードです:

int main(void)
{
    FILE* filePtr = fopen("text.txt", "r+");
    char c;
    while( (c = fgetc(filePtr)) != EOF )
    {
        if(c == '\t')
        {
            fseek(filePtr, -1, SEEK_CUR);
            fputc(' ', filePtr);
            fseek(filePtr, 0, SEEK_CUR);
        }
    }

    fclose(filePtr)
    return 0;
}
于 2015-04-18T15:19:09.610 に答える
0

問題は、w+fopen フラグを使用してfpos_t、複合型の変数をデクリメントしようとしていることです。使用r+してからデクリメントnum.__posして機能させる必要があります

于 2015-04-16T14:40:40.887 に答える