C ++仅使用数字读取文件

时间:2014-09-06 00:10:24

标签: c++ regex file int double

我正在编写一个读取文件的c ++程序。文件只包含数字,如果没有,则只会引发错误。

我目前可以遍历文件和行并获取每个令牌并告诉每个令牌是什么,但看到我是c ++的初学者我不知道如何仅包含数字。

示例文件是:

1 2 3 4 5.645 50603 0.543 5.0
100 5.555555 600 1 0 5

               67.64

65.6                                 70

                <spaces>

            90

我尝试查找了几种方法,并尝试使用空间作为分隔符,但我必须考虑一个空行的空格,这是一个分隔符混乱。

到目前为止,我已尝试过这些方法:

此方法接受“5.0”,但仅将其打印为“5”:     双倍;

while(fin >> i)
{
    cout << " Token value: " << i << endl;
}

此方法不会仅使用带空格的换行符/换行符:

int i = 0;
int lineNumber = 1;
char token;
const char* const delimeter = " ";
while (fin.good())
{
    // read line into memory with a max length of 10 characters per line
    char buffer[1024];
    fin.getline(buffer, 1024);

    // array to hold the values until compution
    char* token[1024] = {};


    // strtok splits a string into tokens
    // get the first token
    token[0] = strtok(buffer, delimeter);

    // check if the first line is blank (blank is set to 0)
    if (token[0])
    {
        for (i = 1; i < 1024; i++)
        {
            // get more tokens
            token[i] = strtok(0, delimeter);

            // check if there are no more tokens
            if (!token[i])
            {
                break;
            }
        }
    }

    for (int j = 0; j < i; j++)
    {

        // if (token[j] == " ") cout << " this is a space" << endl;
        cout << " Line: " << lineNumber << " --- Token[" << j << "] = " << token[j] << endl;
    }
    cout << endl;
    i++;
    lineNumber++;

}

对c ++初学者的任何建议(我有Java经验)?

编辑:期间角落案例:

似乎没有一个句号的识别,如果它在最后一行和唯一的字符。它没有错误也没有打印出这段时间:

12 35 67777.75
54433
.

但是,如果它是这样的话,它会抛出正确的错误:

12 36 67777.75
.
54433

1 个答案:

答案 0 :(得分:1)

这可能对您有用。

您可以通过这种方式逐一阅读数字:

int main()
{
    std::ifstream fin("mydatafile.txt");

    // check for errors
    if(!fin.is_open())
    {
        std::cerr << "ERROR: opening input file:" << std::endl;
        return 1; // error code 1
    }

    double d;
    while(fin >> d) // skips spaces and newlines automatically
    {
        // do what you want with the number d here (print it?)
        std::cout << d << '\n';
    }

    // Did we read all the data or was there a problem?
    if(!fin.eof())
    {
        std::cerr << "ERROR: failed to read all the data from input file:" << std::endl;
        return 2; // error code 2
    }

}

while(fin >> d)非常惯用。它确保仅在读取成功时才执行循环体。它考虑到在强读取期间发生错误。

修改

添加测试以查看文件是否一直读到最终

修改

作为替代方案,您可以将文本文件中的每个条目读入std::string,然后测试std::string是否转换为double

#include <fstream>
#include <sstream>
#include <iostream>

int main()
{
    std::ifstream fin("mydatafile.txt");

    // check for errors
    if(!fin.is_open())
    {
        std::cerr << "ERROR: opening input file:" << std::endl;
        return 1; // error code 1
    }

    std::string s;
    while(fin >> s) // skips spaces and newlines automatically
    {
        // now see if we can convert s into a number by
        // turning s into an input stream and read it into a number

        double d;
        if(std::istringstream(s) >> d)
        {
            // do what you want with the number d here (print it?)
            std::cout << d << '\n';
        }
        else
        {
            std::cerr << "ERROR: bad data: \"" << s << "\"" << std::endl;
            // continue? Or not?
        }
    }

    if(!fin.eof())
    {
        std::cerr << "ERROR: failed to read all the data from input file:" << std::endl;
        return 2; // error code 2
    }
}