我有以下.txt文件:
的test.txt
1,2,5,6
传入我通过命令行创建的小型C ++程序,如下所示:
./test test.txt
来源如下:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char **argv)
{
int temp =0;
ifstream file;
file.open(argv[1]);
while(!file.eof())
{
temp=file.get();
file.ignore(1,',');
cout<<temp<<' ';
}
return 0;
}
由于某些原因,我的输出不是1 2 5 6
而是49 50 53 54
。是什么给了什么?
更新:
另外,我注意到get()
的另一个实现。如果我定义char temp
,那么我可以file.get(temp)
,这也将节省我转换ASCII表示。但是我喜欢使用while (file >> temp)
,所以我将继续使用它。感谢。
答案 0 :(得分:1)
temp
是一个int。因此,在将char转换为int之后,您会看到编码的ascii值。
答案 1 :(得分:0)
49是数字49-48 = 1的ascii代码。
get()
为您提供一个字符(字符代码)。
顺便说一句,eof()
只有在读取尝试失败后变为,所以您显示的代码
while(!file.eof())
{
temp=file.get();
file.ignore(1,',');
cout<<temp<<' ';
}
最终可能会显示一个无关紧要的字符。
传统的循环是
while( file >> temp )
{
cout << temp << ' ';
}
其中表达式file >> temp
读入一个数字并生成对file
的引用,并且file
反对的地方转换为bool
,就像您已经写过一样
while( !(file >> temp).fail() )
答案 2 :(得分:0)
这不符合你的想法:
while(!file.eof())
Why is iostream::eof inside a loop condition considered wrong?中对此进行了介绍,因此我不会在此答案中介绍它。
尝试:
char c;
while (file >> c)
{
// [...]
}
...来代替。使用char
而不是int
阅读也可以节省您转换ascii表示形式(ASCII值49为1
,等... )。
答案 3 :(得分:0)
对于记录,尽管这是第n个重复,这里是这个代码在惯用C ++中的样子:
for (std::string line; std::getline(file, line); )
{
std::istringstream iss(line);
std::cout << "We read:";
for (std::string n; std::getline(iss, line, ','); )
{
std::cout << " " << n;
// now use e.g. std::stoi(n)
}
std::cout << "\n";
}
如果您不关心线条或只有一条线,则可以跳过外部循环。