我在本实验室的输出中遇到了一个相当有趣的错误,我想知道你们中是否有人能够暗示我的问题所在。
目标是找到记录的高,低,平均值和输出原始记录。 我开始使用一个相当基本的程序来解决一个记录,当我实现这个时,我扩展了程序以使用整个文本文件。最初程序会正确输出:
346 130 982 90 656 117 595高#低#Sum#Average#
当我将它扩展为整个记录的工作时,我的输出停止了我想要的工作方式。
0 0 0 0 0 0 0高:0低:0总和:0平均:0 0 0 0 0 0 0 0高:0低:0总和:0平均:0 等...
我无法弄清楚为什么我的ifstream完全停止了从文件中输入值的麻烦。
我会去散步并再次采取行动。如果这不起作用,我会回到这里检查是否有任何回复=)
谢谢!
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
int num;
int high = 0;
int low = 1000;
double average = 0;
double sum = 0;
int numcount = 0;
int lines = 1;
char endoline;
ifstream inData;
ofstream outData;
inData.open("c:\\Users\\Nikko\\Desktop\\record5ain.txt");
outData.open("c:\\Users\\Nikko\\Desktop\\record5aout.txt");
if(!inData) //Reminds me to change path names when working on different computers.
{
cout << "Could not open file, program will exit" << endl;
exit(1);
}
while(inData.get(endoline))
{
if(endoline == '\n')
lines++;
}
for(int A = 0; A < lines; A++)
{
for(int B = 0; B < 7; B++)
{
while(inData >> num)
inData >> num;
numcount++;
sum += num;
if(num < low)
low = num;
if(num > high)
high = num;
average = sum / numcount;
outData << num << '\t';
}
outData << "High: " << high << " " << "Low: " << low << " " << "Sum: " << sum << " " << "Average: " << average << endl;
}
inData.close();
outData.close();
return(0);
}
答案 0 :(得分:0)
在内部循环中,您将读取直到流进入故障模式,例如,因为收到了错误的格式或流已到达终点。一旦流进入故障模式,它将保持在该模式,直到使用错误标志,例如,使用inData.clear()
。我不知道你的输入看起来如何,但假设它是一个完全由数字组成的文件,它只会读取整个文件。如果你想早点退出阅读,你需要做点什么。例如,您可以使用操纵器跳过空格并在到达换行符时将流设置为失败状态:
std::istream& skip(std::istream& in) {
std::istream::sentry cerberos(in, false);
if (in) {
while (std::isspace(in.peek()) {
if (in.get() == '\n') {
std::in.setstate(std::ios_base::failbit);
}
}
}
}
...稍后,当读取整数时使用此:
int value(0);
while (in >> skip >> value) {
// ...
}
// ...
if (!in.eof()) {
in.clear();
}
当skip
遇到换行符时,在读取记录(行)时将流设置为失败模式。处理完行后,流状态将被清除,除非失败是由于也达到了EOF,这将设置使用std::ios_base::eofbit
测试的in.eof()
。
答案 1 :(得分:0)
我认为你有太多的周期:)
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
int num;
int high = 0;
int low = 1000;
double average = 0;
double sum = 0;
int numcount = 0;
int lines = 1;
char endoline;
ifstream inData;
ofstream outData;
inData.open("c:\\Users\\Nikko\\Desktop\\record5ain.txt");
outData.open("c:\\Users\\Nikko\\Desktop\\record5aout.txt");
if(!inData) //Reminds me to change path names when working on different computers.
{
cout << "Could not open file, program will exit" << endl;
exit(1);
}
while(inData.get(endoline))
{
if(endoline == '\n')
lines++;
sum = 0;
average = 0.;
high = 0;
low = 1000;
//you have to reinitialize these values for every row
while(inData >> num)
{
numcount++;
sum += num;
if(num < low)
low = num;
if(num > high)
high = num;
average = sum / numcount;
outData << num << '\t';
}
outData << "High: " << high << " " << "Low: " << low << " " << "Sum: " << sum << " " << "Average: " << average << endl;
}
inData.close();
outData.close();
return(0);
}
答案 2 :(得分:0)
感谢您抽出宝贵时间帮我解决这个问题。我从你的两个回复中借了一些东西。
在我的第一个while循环后,我添加了inData.clear(); &安培; inData.seekg(0);.添加这些已停止我的inData&gt;&gt;数字来自-858993460。
我还删除了麻烦的同时(inData&gt;&gt; num)并简单地将其替换为inData&gt;&gt; NUM;
最后,我在第一个for循环中设置需要重新初始化为0的变量。