3

forループの各反復で、次のようにデータをファイルに書き込む関数を実行するように、いくつかのコードを書いています。

int main()
{
    int i;

    /* Write data to file 100 times */
    for(i = 0; i < 100; i++)    writedata();

    return 0;
}

void writedata()
{
    /* Create file for displaying output */
    FILE *data;
    data = fopen("output.dat", "a");

    /* do other stuff */
    ...
}

プログラムを実行すると、プログラムの開始時にファイルの内容が削除されますが、その後、ファイルにデータが追加されるようにするにはどうすればよいですか? "w"で識別子を使用すると空の新しいファイルが開かれることはわかっていますが、関数fopen()を通過するたびにファイルにデータを「追加」できるようにしたいため、識別子を使用します。writedata()"a"

4

6 に答える 6

6

これがあなたが実際に行うべき方法です。この方法では、ファイルを 1 回開くだけで済み、開いたときに切り捨てられます。関数プロトタイプも変更する必要があることに注意してください (どこにいても)。

int main()
{
    int i;

    FILE *data;
    data = fopen("output.dat", "w");
    if(!data) {
         perror("Error opening file");
         return 1;
    }

    /* Write data to file 100 times */
    for(i = 0; i < 100; i++)    writedata(data);

    fclose(data);

    return 0;
}

void writedata(FILE *data)
{

    /* do other stuff */
    ...
}
于 2010-03-18T17:57:02.623 に答える
4

なぜこのようにする必要があるのか​​ わかりませんが、ftruncate()POSIX関数が探しているようです。

于 2010-03-18T17:40:26.307 に答える
3

同じファイルを何度も開いているのはなぜですか?

writedataモードを使用して関数の外で開いてw+、ファイルポインタを渡して、それでwritedataできるように/* do other stuff */してみませんか?

于 2010-03-18T17:14:53.663 に答える
1

この先どう?他のいくつかのソリューションほどきちんとしていません。

#include<stdio.h> 
static int t = 0;    
void writedata()
{
   FILE* data;
   if(t == 0) {
      data = fopen("output.dat", "w");
      t++;
   } else {
      data = fopen("output.dat", "a");
   }
} 

int main()
{
    int i;
    for(i = 0; i < 100; i++) writedata();
    return 0;
}
于 2010-03-18T19:05:37.530 に答える
0

この方法はどうですか:

void clear_file(const char *filename)
{ 
    FILE *output = fopen(filename, "w");
    fclose(output);
}

したがって、ファイルは書き込み用に開かれ、自動的に消去されます。

于 2014-03-09T17:15:45.483 に答える
0

おそらく次のようになります。

static void writedata(int append);

int main()
{
    int i;

    /* Write data to file 100 times */
    for(i = 0; i < 100; i++) 
        writedata(i == 0);

    return 0;
}

static void writedata(int append)
{
    /* Create file for displaying output */
    FILE *data;
    data = fopen("output.dat", append ? "a" : "w");

    /* do other stuff */
    ...
}

これは、追加のためにファイルを開く必要があるかどうかを関数に伝えるフラグを渡すだけです。

より良い解決策は、コードをわずかにリファクタリングし、ループの前にファイルを 1 回だけ開き、FILE *関数に渡すことです。そうすれば、既存のファイルに追加するかどうかを知る必要はありません。

于 2010-03-18T17:14:33.380 に答える