0

まず、これは私の最初のCプロジェクト(および任意の言語での最初のプログラミングプロジェクトの1つ)なので、構文がおかしいと思われる場合や、おかしなことをした場合は、お詫び申し上げます。

3つの入力ファイルを使用するプログラムがあります。各ファイルにはいくつかの数値が含まれています。一部は整数で、一部は浮動小数点数です。私はファイルが存在するかどうかを確認できましたが、他のものは確認できませんでした。これらの要件のいずれかが満たされていない場合、プログラムは終了し、それに応じてエラーメッセージを表示する必要があります。これらのうちの1つを尋ねる質問を見たことがありますが、すべてを組み合わせたわけではありません。私が見た答えはまた、少しスペースをやめる必要があります。私はこれをできるだけ少ない行で実行したいと思っていました。ヘルプは大歓迎です。

私が取り組んできたスクリプトの1つを以下に示します。入力ファイルがない場合はエラーメッセージが表示されますが、intとfloatをチェックし、それらが範囲内にあるかどうかを確認する試みを削除しました。


#include "header.h"
void visualreader(int *x_range, int *y_range, int *z_range,
                  int *x_cells, int *y_cells, int *z_cells, int *time) {

  // Scans the input file containing parameters for visualizing
  // the velocity vector field
  FILE *fp = fopen("visual_input.dat", "r");

  if (fp) {
    fscanf(fp, "%d %d %d\n", x_range, y_range, z_range);
    fscanf(fp, "%d %d %d\n", x_cells, y_cells, z_cells);
    fscanf(fp, "%d\n", time);
    fclose (fp);
  } else {
    perror("error opening the file" );
  }
}
4

5 に答える 5

1

ファイルがプレーン C に存在するかどうかを確認するには、次のように unistd.h でアクセス関数を使用できます。

if( access( "visual_input.dat", F_OK ) != -1 ) {
    // file exists
} 
于 2012-05-13T15:16:02.463 に答える
1

入力ファイルが存在するかどうかを確認する

fopen()失敗すると返さNULLれるため、条件付き withfpが正しい方法です。

ファイル内の数値が int または float の場合

値を文字列として読み取ってから、文字列内の a を手動で確認する必要.があります。正直なところ、値が浮動小数点数になる可能性がある場合は、常に浮動小数点数であると想定して、そのように読み取ります。この段階で int を最適化するためにプログラムを複雑にすることは何の役にも立ちません。

それらが範囲内にある場合

(float として) 読み込まれた値ごとに、次のように手動で確認します。

if (x_range < minimum_value || x_range > maximum_value) {
  error_routine(...);
}
于 2012-05-13T14:43:15.893 に答える
0

次のサンプルはメイン プログラムですが、簡単にライブラリ関数にすることができます。ライブラリ関数に変換された場合は、何も出力しませんが、代わりに値を返します。

このプログラムをテストするには -- 私は Ubuntu 10.04 を使用しています --echo $?プログラムが完了したら、エラー コードを確認します。0 は成功、0 以外は失敗です。

ファイルのオープンが成功した場合は、fclose を追加しました。ファイルを開いて閉じないのは悪い習慣です。

errno と fp の両方の値のチェックを含めました。私は C fopen のドキュメントを確認しましたが、実際に確認する必要があるのは、fp の値が NULL かどうかだけです。したがって、&& の代わりに || を使用しました。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define MIN_ARGS_SUPPLIED 2

int main(int argc, char *argv[])
{
    FILE *fp;
    int rc = 0;

    if(MIN_ARGS_SUPPLIED != argc)
    {
       printf("Usage: file_detect file-name\n");
       rc = -1;
    }
    else
    {
        errno = 0; /* errno is already declared by including errno.h */

        fp=fopen(argv[1],"r");

        if(fp == NULL || errno == ENOENT)
        {
           rc = errno; 
        }
        else
        {
            fclose(fp);
        }
    }

    return rc;
}
于 2012-07-15T21:51:34.863 に答える
0

ファイルが存在するかどうかを検出するサンプルを次に示します。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(){
    FILE *fp;
    errno = 0;
    fp=fopen("Not_exist.txt","r");
    if(fp == NULL && errno == ENOENT)
        perror("file does not exist");
    else
        fclose(fp);

    return 0;
}
于 2012-05-13T22:17:25.707 に答える
0

ファイルの存在のテストは、OS 固有です。ただし、標準ライブラリ呼び出しのみを使用すると、fopen()失敗するとerrnoが設定されます。値は OS 固有ですが、use を使用perror()して意味のあるメッセージを出力できます。

fscanf() を使用しているため、値がバイナリ値ではなく数値の ASCII 表現であることを意味します。%f 書式指定子を使用してすべての値を浮動小数点として解釈すると、実数整数の両方の10 進数表現が正しく解釈されます。これは、数値が整数であることを意図しているかどうかを調べて判断しようとするよりも簡単です。

于 2012-05-13T18:05:50.333 に答える