繁体   English   中英

fstream 输入负数失败

[英]fstream fails at inputting negative numbers

所以我试图做一个小程序,当我尝试从 .txt 文件输入负数时,我的程序失败了,只是在第一个负数之后输出随机的东西。

#include <iostream>
#include <string>
#include <fstream>
#include <cmath>

using namespace std;

struct imones{
    string vardas;
    int koordx;
    int koordy;
};

void skaityti(int &n, int &m, imones A[]){
    ifstream ivest;
    ivest.open("U1.txt");
    ivest >> n >> m;
    for(int i=0; i<n; i++){
        ivest >> A[i].vardas >> A[i].koordx >> A[i].koordy;
    }
    ivest.close();
}


int main()
{
    imones A[50];
    int n, m;
    skaityti(n, m, A);
    cout << A[0].vardas << " " << A[0].koordx << " " << A[0].koordy<<endl;
    cout << A[1].vardas << " " << A[1].koordx << " " << A[1].koordy<<endl;
    cout << A[2].vardas << " " << A[2].koordx << " " << A[2].koordy<<endl;
    cout << A[3].vardas << " " << A[3].koordx << " " << A[3].koordy<<endl;
    cout << A[4].vardas << " " << A[4].koordx << " " << A[4].koordy<<endl;
}

U1.txt:

5 30
Siuntuva    2 3
Auda        3 –1
Kostisa     –3 –2
Linga       3 0
Austuva     –2 –4

并且在输出时,-1 及其后的所有内容都变为随机数。

在您的输入文件行中,那些-字符似乎有点太宽了,尽管它非常微妙且难以发现:

- : a regular minus sign.
– : one from your file.

这就是您的输入不起作用的原因,因为您的输入数据与所需的格式不匹配。 这会导致operator>>失败,因此不会将任何有用的值加载到数组中。

虽然它不会指出失败的原因,但如果您检查了operator>>结果,至少会收到问题通知,例如:

if (! (ivest >> A[i].vardas >> A[i].koordx >> A[i].koordy))
    throw std::runtime_error("Something went wrong reading the file");

除了“Mickey Mouse”程序(或“Janet and John”,或“See Spot Run”,或任何其他表示极其简单的短语)之外,您通常应该更喜欢检查可能失败的语句,看看它们是否确实失败了。 即使抛出异常并退出程序也比继续处理坏数据要好。

事实证明,您使用的字符看起来像一个en-dash Unicode U+8211 ,而您需要的是一个hyphen-minus U+0045 当您将文字处理文档中的内容复制并粘贴到数据文件或源代码中时,您经常会遇到这些(以及em-dashes和“智能引号”,它们也会引起麻烦)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM