我正在编写一个读取文件的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
答案 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
}
}