0

このクラス関数 CLASS::READWRITE は、入力値が int 型の場合にのみ、入力ファイルからデータを読み取り、出力ファイルに書き込むことになっています。x として渡される浮動小数点値を入力すると、小数点以下が切り捨てられ、警告を出力する代わりに関数が正常に実行されます。x として 'b' のような小文字が渡された場合、値は明らかに "0" として読み取られるため、関数は警告を出力する代わりに正常に実行されます。

チェック (x != int) を強制するにはどうすればよいですか? cin.fail() の使用に関する提案を見てきましたが、ここでは cin を使用していません。

#include <iostream>
#include <fstream>
using namespace std;

ifstream input_file("in_file", ios::in);
ofstream output_file("out_file", ios::out);

int main(void)
{
    CLASS object(n);                // n is the number of values held in in_file
    object.READWRITE(x);            // x is some test value

}

void CLASS::READWRITE(int x)
{
    int i;
    for(i = 0; i < n; i++)
    {
        input_file >> number[i];
    }

    for(i = 0; i < n; i++)
    {
        if((x != int) || (x < 0))
        {
            out_file << "Error" << endl;
            break;
        }
        else
        {
            out_file << num[i] << endl;
        }
    }
}
4

2 に答える 2

2

これは正確にはあなたが探しているものではありませんが、整数のみを転送していることを確認したい場合は、文字列をチェックする必要があります。そして、あなたが特にC ++を求めている間、私はCファイルの処理に慣れているので、我慢してください。

FILE *fp = fopen("input.file", "rb"), op = fopen("output.file", "wb");
if(fp && op) {
     while(!feof(fp)) {
         char buffer[20], *ptr = buffer;
         fscanf(fp, "%20[^\s\n]", buffer);
         while(ptr && *ptr != 0) {
             if(*ptr >= '0' && *ptr <= '9') ++ptr;
             else ptr = 0;
         }
         if(ptr) fprintf(op, "%s", buffer);
     }
     fclose(fp);
     fclose(op);
}

つまり、このコードはファイル全体をスキャンして、スペースまたは改行で区切られたブロックを探します(1つの数字が20文字以下であると想定します)。次のステップでは、問題の文字が数字であるかどうかを検出します(この場合、ポインタは1ステップ上に移動します)、または移動しません。後者の場合、文字列は整数として無効であり、破棄されます(ポインタは0に設定され、ループ後の「書き込み」は無効になります。

私はこれがあなたが探していることをするはずだと信じています。

于 2013-02-24T21:31:07.537 に答える
1

パラメータ x を int として宣言したため、int です。

void CLASS::READWRITE(int x)

double または char を渡すと、コンパイラはそれらを暗黙的に整数値にキャストします。double の場合、これは 10 進数の後の切り捨てを意味し、char の場合、コンパイラは ASCII 表現を整数として扱います。

ここで他の人が持っているように、パラメーター x がユーザー/ファイル入力から来ていると仮定すると、各入力文字列を手動でチェックして、それが有効な整数であることを確認する必要があります。入力がバイナリの場合、データはコンテキストに依存するため、実際に判断する方法はありません。

于 2013-02-24T22:06:17.540 に答える