[英]Difficulty analyzing text from a file
我在本練習中的輸出遇到一個相當有趣的錯誤,我想知道你們中的任何人是否能夠暗示我的問題所在。
目標是找到記錄的最高,最低,平均值,總和,並輸出原始記錄。 我從一個相當基本的程序開始解決一條記錄,當我做到這一點時,我將該程序擴展為可以處理整個文本文件。 最初,程序將正確輸出:
346130982 90656656117595高#低#總和#平均#
當我將其擴展為可用於整個記錄時,我的輸出停止了按我希望的方式工作。
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);
}
在內部循環中,您將讀取直到流進入故障模式為止,例如,因為接收到錯誤的格式或流到達末尾。 一旦流進入故障模式,它將保持在此模式,直到使用錯誤標志為止,例如,使用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導致的,該EOF將設置使用in.eof()
測試的std::ios_base::eofbit
。
我認為您的周期太多:)
#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);
}
謝謝你們倆花時間幫助我解決這個問題。 我從您的兩個答復中借來了一些信息。
在我的第一個while循環之后,我添加了inData.clear();。 &inData.seekg(0);。 添加這些阻止了我的inData >> num被填充為-858993460。
我還刪除了煩人的while(inData >> num),並簡單地將其替換為inData >> num;。
最后,我在第一個for循環中將需要重新初始化的變量設置為0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.