0

此类函数 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;
        }
    }
}
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);
}

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

我相信这应该可以满足您的需求。

于 2013-02-24T21:31:07.537 回答
1

您将参数 x 声明为 int 所以它是 int

void CLASS::READWRITE(int x)

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

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

于 2013-02-24T22:06:17.540 回答