我想从输入文件中读取数据
70 95 62 88 90 85 75 79 50 80 82 88 81 93 75 78 62 55 89 94 73 82
并将每个值存储在数组中。还有更多这个特殊的问题(其他功能现在被注释掉了)但是这真的给我带来了麻烦。我在前一个关于数据和数组的问题上找了好几个小时,但我找不到我犯错的地方。
这是我的代码:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const int SIZE = 22;
int grades[SIZE];
void readData() {
int i = 0;
int grades[i];
string inFileName = "grades.txt";
ifstream inFile;
inFile.open(inFileName.c_str());
if (inFile.is_open())
{
for (i = 0; i < SIZE; i++)
{
inFile >> grades[i];
cout << grades[i] << " ";
}
inFile.close(); // CLose input file
}
else { //Error message
cerr << "Can't find input file " << inFileName << endl;
}
}
/*
double getAverage() {
return 0;
}
void printGradesTable() {
}
void printGradesInRow() {
}
void min () {
int pos = 0;
int minimum = grades[pos];
cout << "Minimum " << minimum << " at position " << pos << endl;
}
void max () {
int pos = 0;
int maximum = grades[pos];
cout << "Maximum " << maximum << " at position " << pos << endl;
}
void sort() {
}
*/
int main ()
{
readData();
return 0;
}
这是我的输出:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
感谢您的时间。
答案 0 :(得分:1)
我在阅读文件时没有看到任何问题,你只是混淆了成绩的全局与局部变量
你不需要这个
int i = 0;
int grades[];
在函数readData
中#include <string>
using namespace std;
const int SIZE = 22;
int grades[SIZE];
void readData() {
string inFileName = "grades.txt";
ifstream inFile;
inFile.open(inFileName.c_str());
if (inFile.is_open())
{
for (int i = 0; i < SIZE; i++)
{
inFile >> grades[i];
cout << grades[i] << " ";
}
inFile.close(); // CLose input file
}
else { //Error message
cerr << "Can't find input file " << inFileName << endl;
}
}
int main()
{
readData();
return 0;
}
答案 1 :(得分:1)
问题是您声明了一个大小为1的本地grades
数组,隐藏了全局grades
数组。不仅如此,您现在正在访问超出边界的数组,因为本地grades
数组只能容纳1个项目。
所以摆脱界限:
int grades[i];
但是,需要提到的是:
int i = 0;
int grades[i];
是无效的C ++语法。您错误地偶然发现了这一点,但如果使用严格的ANSI C ++编译器进行编译,则代码将无法编译。
必须使用常量表达式声明C ++中的数组,以表示数组中的条目数,而不是变量。您不小心使用了一个名为可变长度数组或VLA的非标准编译器扩展。
如果这是针对学校作业的,不要以这种方式声明数组(即使你打算这样做),因为它不是正式的C ++。如果要声明动态数组,那就是std::vector
的用途。
答案 2 :(得分:1)
原始全局数组grades
,大小为22,将由具有相同名称但大小为0的本地数组替换。
(它没有被覆盖,只是使用变量grades
的任何代码,在第二个定义的范围内,将读取第二个grades
数组的值,因为它具有更高的优先级。)
当您阅读超出其大小时,inFile >> grades[i];
和cout << grades[i] << " ";
都应返回运行时错误(看起来您没有使用严格的编译器)。
[int grades[i];
通常会返回编译时错误,因为您不应该/通常无法使用变量初始化固定数组
我认为正在发生的事情,而不是程序崩溃,是grades[i]
只是返回一个值为0的变量的匿名实例,因此输出。
对您的问题最简单的解决方法是删除int grades[i]
。
(同时删除其中一个int i = 0
,因为您不需要定义两次)