C++ "Using Uninitialized Memory.. (variable name) "



该程序从文本文件"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'

文本文件"企鹅.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++ 很陌生,所以我不确定出了什么问题。

给定

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

根据运算符优先级,operator >>的优先级高于operator,并且

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

即只有zName被设置为penguinInfo >> zName

您可以将其更改为

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

问题是逗号运算符没有做你认为它做的事情。它只是丢弃左侧和侧面,并继续右侧:

在逗号表达式 E1、E2 中,计算表达式

E1,丢弃其结果(尽管如果它具有类类型,则在包含完整表达式的末尾之前不会销毁它(,并且在表达式 E2 的计算开始之前完成其副作用(请注意,用户定义的运算符不能保证排序((直到 C++17(。

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

您实际要做的是链接>>运算符,就像链接<<运算符一样。这将看起来像这样:

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

最新更新