【问题标题】:C++ "Using Uninitialized Memory.. (variable name) "C++“使用未初始化的内存..(变量名)”
【发布时间】:2019-12-13 02:33:14
【问题描述】:

此程序从文本文件“penguins.txt”中读取行并将数据复制到“FeedingOutput.dat”中。它在另一台 PC 上运行良好,但是当我在笔记本电脑上运行它时,出现以下错误:

 Using Uninitialized Memory 'zFeeding'
 Using Uninitialized Memory 'zPercent'
 Using Uninitialized Memory 'dFeeding'
 Using Uninitialized Memory 'dPercent'
 Using Uninitialized Memory 'wFeeding'
 Using Uninitialized Memory 'wPercent'

文本文件“penguins.txt”如下所示:

Zany A 5 4
Den B 4 8
Windi C 5 2.1

.txt 和 .dat 文件与 .cpp 文件位于同一目录中。

这是我的代码:


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

using namespace std;


int main()
{

    double zFeeding; //Declaring variables
    double dFeeding;
    double wFeeding;
    double zPercent;
    double dPercent;
    double wPercent;
    double zFeedingNew;
    double dFeedingNew;
    double wFeedingNew; 

    char filename[50];
    string zName, dName, wName, zID, dID, wID;


    ifstream penguinInfo; //Allows input and output for the two different files
    ofstream dataOutput;


    cout << "Enter filename containing penguins information" << endl; //Asking for user to input file name, then opening that file
    cin.getline(filename, 50);
    penguinInfo.open(filename);
    dataOutput.open("FeedingOutput.dat");


    dataOutput << showpoint << fixed << setprecision(2); ////formating the output

    //this will set the information from penguins.txt to actual variables.
    penguinInfo >> zName, zID, zFeeding, zPercent, dName, dID, dFeeding, dPercent, wName, wID, wFeeding, wPercent;


    zFeedingNew = zFeeding + (zFeeding * (zPercent / 100)); //equations for new feeding amounts
    dFeedingNew = dFeeding + (dFeeding * (dPercent / 100));
    wFeedingNew = wFeeding + (wFeeding * (wPercent / 100));


    dataOutput << zName << " " << zID << " " << zFeedingNew << " lbs." << endl; //Outputs data to FeedingOutput.dat for Zany


    dataOutput << dName << " " << dID << " " << dFeedingNew << " lbs." << endl; //Outputs data to FeedingOutput.dat for Den


    dataOutput << wName << " " << wID << " " << wFeedingNew << " lbs." << endl; //Outputs data to FeedingOutput.dat for Windi


    penguinInfo.close(); //close files and requires approval to close the program
    dataOutput.close();
    system("pause");
    return 0;


}

我相信这可能是一个范围问题,但我对 c++ 很陌生,所以我不确定出了什么问题。

【问题讨论】:

  • 通常代码不应该有水平条,使用另一行继续&gt;&gt; on penguinInfo

标签: c++ file memory file-io


【解决方案1】:

给定

penguinInfo >> zName, zID, zFeeding, zPercent, dName, dID, dFeeding, dPercent, wName, wID, wFeeding, wPercent;

根据operator precedenceoperator &gt;&gt; 的优先级高于operator,,与operator, 相同

(penguinInfo >> zName), zID, zFeeding, zPercent, dName, dID, dFeeding, dPercent, wName, wID, wFeeding, wPercent;

即只有zName 设置为penguinInfo &gt;&gt; zName

你可以改成

penguinInfo >> zName >> zID >> zFeeding >> zPercent >> dName >> dID >> dFeeding >> dPercent >> wName >> wID >> wFeeding >> wPercent;

【讨论】:

    【解决方案2】:

    问题在于comma operator 并没有按照您的想法执行。它只是丢弃了左侧和右侧,并继续使用右侧:

    在逗号表达式 E1, E2 中,表达式 E1 被求值,它的结果被丢弃(尽管如果它有类类型,它直到包含完整表达式的末尾才会被销毁),它的副作用是在表达式 E2 开始计算之前完成(请注意,用户定义的运算符不能保证顺序)(直到 C++17)。

    最重要的是,它不会用任何东西填充逗号表达式中使用的所有变量。因此,您的变量保持未初始化(因为您没有在上面初始化它们)。

    您真正想要做的是链接&gt;&gt; 运算符,就像您链接&lt;&lt; 运算符一样。看起来应该是这样的:

    penguinInfo >> zName >> zID >> zFeeding >> zPercent >> dName >> dID >> dFeeding >> dPercent >> wName >> wID >> wFeeding >> wPercent;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      相关资源
      最近更新 更多