【问题标题】:Input elements differ from output elements from files C++输入元素与文件 C++ 中的输出元素不同
【发布时间】:2016-11-29 00:12:26
【问题描述】:

我的代码遇到了一些问题。我被要求将 .dat 文件中的元素输入到数组中。对于类,我们必须在不知道每个文件中有多少元素的情况下对各种文件执行此操作。我们唯一知道的是,这里的每个文件永远不会超过 5000 个元素。

我的一个输入文件包含以下元素:

5.675207 -0.571210
0.728926 0.666069
2.290909 0.751731 2.004545 0.907396
0.702893 0.646427 5.909504 -0.365045
2.082645 0.871841 5.597107 -0.633507
6.117769 -0.164663 6.091736 -0.190282
5.571074 -0.653433 4.503719 -0.978307
3.983058 -0.745620
3.670661 -0.504729
5.857438 -0.413001

当我运行我的代码时:

#define _CRT_NONSTDC_NO_DEPRECATE
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

int main(int argc, char * argv[])
{
ifstream fin;
ofstream fout;

if (argc < 3)
{
    cout << "Incorrect usage:  prog.exe filenname number" << endl;
    cout << "Exiting now, please try again." << endl;
    return -1;
}

fin.open(argv[1]);
if (!fin)
{
    cout << "Error opening file \"" << argv[1] << "\", exiting." << endl;
    return -1;
}

fout.open(argv[2]); 

int count = 0;
int word; 
double points[5000]; 

while (fin >> word) 
{
    fin >> points[count]; 
    ++count; 
}

fout << "Numer of points is: " << count/2 << endl; 

for (int i = 0; i < count; i++)
{
    fout << points[i] << " "; 
}

fin.close();
fout.close(); 

return 0;
}

我输出元素只是为了确保它们被正确输入。我得到以下信息,但我不知道为什么。

0.675207 0.57121 
0.728926 0.666069 
0.290909 0.751731 0.004545 0.907396 
0.702893 0.646427 0.909504 0.365045 
0.082645 0.871841 0.597107 0.633507 
0.117769 0.164663 0.091736 0.190282 
0.571074 0.653433 0.503719 0.978307 
0.983058 0.74562 
0.670661 0.504729
0.857438 0.413001

第一个数字由于某种原因被转换为 0,负数变为正数。有人知道为什么会这样吗?

【问题讨论】:

  • 您应该学习如何使用调试器并逐步执行代码。
  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • 您从流中读取项目两次(交替读取wordpoints[count])。

标签: c++ arrays file-io


【解决方案1】:
int word;

对你没有好处。首先它是一个整数,所以fin &gt;&gt; word 只读取输入的整数部分。 5.675207 被读取为 5。.675207 保留在文件流中,用于fin &gt;&gt; points[count]。 Words 不会存储到 5 的任何位置,但 .675207 会在 points[0] 中以 0.675207 的形式存在。

我没有费心去弄清楚负面迹象的去向,因为

while (fin >> points[count])
{
    ++count;
}

修复一切。

【讨论】:

    【解决方案2】:

    当您从文件中读取数字时,您会将它们提取为“单词”,然后将它们存储为“点”。 “word”是一个整数,“points”是一个 double,这会给你带来意想不到的行为。编译器应该对此给出警告。

    【讨论】:

    • 还应该指出他从fin读了两次,这几乎不是他想要的
    • 我将 'word' 更改为双精度,但我将所有其他元素都放入了我的文件中。它还不断将小数点前的第一个数字更改为 0
    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2022-11-06
    • 2020-11-18
    • 2013-12-08
    • 2017-08-30
    相关资源
    最近更新 更多