2017-01-24 6 views
1

のCプログラミングの節約テキストファイルに関しては、私はCプログラミングでファイルを保存すると、ファイル名は次のようにする必要があります:似た名前

  1. game1.txtのdoesntが存在する場合、それはgame1.txtする必要があります。
  2. game1.txtが存在する場合、game2.txtにする必要があります。
  3. game2.txtが存在する場合、game3.txtにする必要があります。

など... どうすればいいですか?

答えて

1

あなたは移植できるようにしたい場合:

  • がループカウンタ
  • sprintf()
  • fopen()ファイル「ゲーム%のd.txt」フォーマット文字列を使用してファイル名を使用し
  • を読み取るため
    • これが成功した場合:継続して閉じてください。
    • それが失敗した場合:ループからの出口と競合状態があることを

注意を書き込むためのファイルを開きます。読書のための開口部が失敗した場合は、別のプロセスがあなたの前にファイルを作成することができます書くためにそれを開きます。

fopen()モードフラグ "x"のGNU拡張機能があります。これは排他的に開くためのものです。これを使用すると競合状態が解消されます。

+0

'x'フラグは、C11で定義された' fopen() '関数の一部であり、' C11の附属書K.3.5で文書化された 'fopen_s()'関数の一部です。したがって、 'fopen_s()'を使うとWindows上で利用できるかもしれません。 –

0

What's the best way to check if a file exists in C? (cross platform)この質問から、最良の解決策は、unistd.hヘッダーにあるaccess()機能を使用しているようです。

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

const size_t MAX_FILENAME_LENGTH = 12; 
const int MAX_FILENAME_TRIES = 1000; 

char *get_next_filename() 
{ 
    char *filename = malloc(MAX_FILENAME_LENGTH); 
    FILE *file; 
    int found = 0, i = 0; 

    do { 
     snprintf(filename, "game%d.txt"); 
     if (access(filename, F_OK) < 0) { //if file does not exist, we've found our name! 
      found = 1; 
     } else { 
      ++i; 
     } 
    } while (! found && i < MAX_FILENAMES_TRIES); 
    return filename; 
} 

ここでコードは、NがMAX_FILENAME_TRIESの値であるgameN.txt、最大game0.txtから出発して、C文字列として次の利用可能なファイル名を返します。使用した後は、ファイル名をfree()に忘れないようにしてください。

+0

POSIX 'access()'を使うつもりなら、POSIX 'open()'と 'O_EXCL | O_CREAT'を実行するので、ファイルが存在しない場合は作成されますが、TOCTOU(チェックの時間、使用時間)の脆弱性がない場合は失敗します。ファイルディスクリプタ( 'int')をファイルストリーム(' FILE * ')に変換するには' fdopen() 'を使うことができます。これは 'mkstemp()'と似ています。ファイルを作成し、ファイル記述子を返します。 'malloc()'と 'free()'の使用を強制するのではなく、名前のためのスペースを関数に渡す方が良いでしょう。あなたのコードからの漏れはありません。 –