【问题标题】:C++ I/O don't understand why there is -1C++ I/O 不明白为什么有 -1
【发布时间】:2011-12-19 08:49:39
【问题描述】:

我只是想从文件中读取每个字符并将它们打印在屏幕上。 为了测试,我尝试在打印字符之前先在控制台屏幕中打印 ascii 值。

我要读取的文件内容如下:

assign1_2.cpp:33:20: error: cannot convert 'std::string 
    {aka std::basic_string<char>}' to 'const char*' for argument '1' 
    to 'int atoi(const char*)'

我使用了下面的代码

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stdlib.h>
using namespace std;

void CountLetters(string filename);

int main()
{
        CountLetters("count.txt");
}

void CountLetters(string filename)
{
    cout << filename << endl;

    ifstream in;
    in.open(filename.c_str(), ios::in);
    vector<char> letter;
    char temp;
    while (!in.eof())
    {
        cout << in.get() << endl;
    }

    in.close();

}

运行这些代码后,我在控制台屏幕的末尾看到“-1”。 有人请解释一下吗?谢谢

【问题讨论】:

  • 那么,count.txt 中有什么内容?你还不如实际上有一个-1
  • 您发布的编译器错误有什么关系?
  • 方法一步步调试了吗?查看所有变量,看看“-1”是出现在 cout &lt;&lt; 中还是作为 main 的返回值。
  • count.txt 包含以下内容:assign1_2.cpp:33:20: error: cannot convert 'std::string {aka std::basic_string}' to 'const char*' for argument '1' 到 'int atoi(const char*)' 谢谢
  • @Martin 好吧,函数返回是无效的。所以我认为 cout 与它没有任何关系?我是 C++ 的新手,所以很抱歉我不太明白你的意思。

标签: c++


【解决方案1】:

不在eof()1 时请勿阅读。这不是一个正确的阅读循环。

在读取成功时读取

int x;
while ((x = in.get()) != EOF)
{
    cout << x << endl;
}

测试in.eof() 不能保证读取成功。当您测试in.eof() 时,您实际上是在测试之前的读取操作是否试图读取文件末尾。这很糟糕,因为这意味着之前的读取操作失败。它失败了,你不在乎,只是按下去使用它返回的值即使它失败了

in.get() 失败时,它返回常量EOF。这就是你应该检查的。如果in.get() 失败,您不想像成功一样继续循环。


1good() 或非bad() 也是如此。

【讨论】:

  • 感谢您的评论!但我有个问题。许多示例似乎都有用于结束循环的 eof。为什么说这不是正确的方法?谢谢
  • @user1047092:你提到的这些例子是什么?万维网上的许多示例(以及一些书籍!)简直就是废话。在 Stack Overflow 上查看 the C++ tag 以获取具有良好 C++ 示例的资源。
  • @user1047092 我添加了一个解释。可悲的事实是,你能找到的很多例子都是完全错误的。我真的不明白为什么人们坚持那种循环。正如您所意识到的,一些简单的测试会立即表明它不正确。
  • +1 以获得深刻的解释。从来不知道有很多例子是错误的。
猜你喜欢
  • 2011-08-19
  • 2022-01-13
  • 2022-11-16
  • 2015-07-05
  • 1970-01-01
  • 2015-05-24
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多