在C ++中检查函数参数数据类型

时间:2013-02-24 21:14:17

标签: c++

此类函数CLASS :: READWRITE应该从输入文件中读取数据,并且只有在其输入值为int类型时才写入输出文件。当我输入浮点值时,值被传递为x,小数位被截断并且函数正常执行而不是输出警告。如果将像'b'这样的小写字母作为x传递,则该值显然读为“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;
        }
    }
}

2 个答案:

答案 0 :(得分: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);
}

简而言之,此代码扫描整个文件以查找由空格或换行符分隔的块(假设任何一个数字不超过20个字符。)在下一步中,它会检测所讨论的字符是否为一个数字(在这种情况下指针向上移动一步),或不。在后一种情况下,字符串作为整数无效并被丢弃(指针设置为0,这反过来使循环后的'write'无效。

我相信这应该是你想要的。

答案 1 :(得分:1)

您将参数x声明为int,因此它是一个int

void CLASS::READWRITE(int x)

传入double或char时,编译器会隐式地将它们转换为整数值。对于双精度,这意味着在小数之后截断,对于chars,编译器将ascii表示视为整数。

假设,正如其他人所知,参数x来自用户/文件输入,您必须手动检查每个输入字符串以确保它是有效整数。如果输入是二进制的,那么由于数据是上下文敏感的,所以无法判断。