文件中的字符不正确

时间:2013-02-24 00:58:35

标签: c++ text-files iostream fstream cout

我有以下.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),所以我将继续使用它。感谢。

4 个答案:

答案 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值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";
}

如果您不关心线条或只有一条线,则可以跳过外部循环。