2013-02-24 33 views
0

该类函数CLASS :: READWRITE应该从输入文件中读取数据,并且只有在其输入值为int类型时才写入输出文件。当我输入一个浮点值作为x传递时,小数位被截断,函数正常执行而不是输出警告。如果像'b'这样的小写字母作为x传递,则该值显然读为“0”,所以函数正常执行而不是输出警告。在C++中检查函数参数数据类型

如何执行检查(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; 
     } 
    } 
} 
+0

在我看来,你正在寻找'typeof'函数。虽然它不是C标准,但仍然被广泛使用。检查此链接http://stackoverflow.com/questions/12081502/typeof-operator-in-c。另外,关于你的其他问题......你正在遭受'隐式转换'。大多数简单的数据类型(char,int,float等)可以隐式转换为对方。你会失去精确度,但就是这样。如果你真的想知道你的文件是什么东西,你需要检查字符串,而不是数字。 – 2013-02-24 21:18:33

+0

整数字符串如何与其他字符串区分? – photon 2013-02-24 21:22:21

+0

够简单。扫描任何不是整数的东西。第一步:获取字符串(两个分隔符之间的任何内容,如空格,换行符等)第二步:检查任何不是这个字符串中的数字。如果有任何不在48-57的范围内(都包括,0-9的ASCII值),它不是一个整数。 – 2013-02-24 21:24:45

回答

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,这反过来则会使循环之后的“写”。

我相信这应该做你在找什么。

1

你声明的参数x是一个int所以它是一个int

void CLASS::READWRITE(int x) 

当你在双或字符通过,编译器隐它们强制转换成一个整数值。双打,这意味着到小数点后截断对于字符,编译器会将ascii表示视为整数。

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