您已经从 cmets 学习了 Why !.eof() inside a loop condition is always wrong. 和 Why is “using namespace std;” considered bad practice?。
如果您的教授要求您使用 POA(普通数组)而不是容器(例如 std::vector),那么您有责任进行所有边界检查,以将您读取的元素限制为不超过数组被声明为持有,并在您读取的元素少于容器将持有的元素的情况下保留读取的元素数量的有效索引。
所以本质上,您的任务是使用 C++ iostream 填充一个普通的 C 数组以进行输入处理。对于初学者,不要使用Magic-Numbers,也不要Hardcode-Filenames。而是:
#define ARRSZ 10 /* if you need a constant, #define one (or more) */
而接受参数的main() 的正确原型是int main (int argc, char **argv)(或*argv[],如果您更喜欢指针数组等效项)。您现在可以将要读取的文件名作为第一个参数传递给程序,而不必重新编译代码来读取另一个文件。要将参数用作要读取的文件名,您只需验证命令行上提供了足够数量的参数(正在运行的程序的名称始终是第一个参数,@987654329 @,所以第一个用户参数是argv[1]),例如
int main (int argc, char **argv) {
if (argc < 2) { /* validate at least one argument given for filename */
std::cerr << "error: insufficient arguments\n"
"usage: " << argv[0] << " in-file\n";
return 1;
}
int ndx = 0, /* index for array */
array[ARRSZ] = {0}; /* array */
std::ifstream fin (argv[1]); /* input file stream */
(注意:如果您只是写信给std::cout,则无需打开std::ofstream文件)
现在您需要做的就是在ndx 小于ARRSZ 时从文件中读取值到您的数组中。您总是希望使用正在使用的读取函数来控制您的读取循环,以便可以使用stream-state 来指示您尝试读取的成功/失败。在这里,您还有另一个要保护的限制——您的数组边界。如果数组中有空间存储值,您只想尝试从文件中读取另一个值。结合两者,您可以将输入循环编写为:
/* protect plain-old array bounds && validate integer input */
while (ndx < ARRSZ && fin >> array[ndx])
ndx++; /* increment index on success */
您现在已将ndx 元素读入您的数组,因此您需要做的就是以forward 和reverse 的顺序输出它们。您可以通过循环 0 <= i < ndx 来实现正向情况,然后 ndx > i >= 0 在反向情况下,例如
std::cout << "forward:\n";
for (int i = 0; i < ndx; i++) /* loop outputting each element */
std::cout << " array[" << i << "]: " << array[i] << '\n';
std::cout << "\nreverse:\n";
for (int i = ndx - 1; i >= 0; i--) /* loop outputting each element */
std::cout << " array[" << i << "]: " << array[i] << '\n';
(注意:不需要关闭文件流——当流指针超出范围时会自动关闭)
总而言之,你可以这样做:
#include <iostream>
#include <fstream>
#define ARRSZ 10 /* if you need a constant, #define one (or more) */
int main (int argc, char **argv) {
if (argc < 2) { /* validate at least one argument given for filename */
std::cerr << "error: insufficient arguments\n"
"usage: " << argv[0] << " in-file\n";
return 1;
}
int ndx = 0, /* index for array */
array[ARRSZ] = {0}; /* array */
std::ifstream fin (argv[1]); /* input file stream */
/* protect plain-old array bounds && validate integer input */
while (ndx < ARRSZ && fin >> array[ndx])
ndx++; /* increment index on success */
std::cout << "forward:\n";
for (int i = 0; i < ndx; i++) /* loop outputting each element */
std::cout << " array[" << i << "]: " << array[i] << '\n';
std::cout << "\nreverse:\n";
for (int i = ndx - 1; i >= 0; i--) /* loop outputting each element */
std::cout << " array[" << i << "]: " << array[i] << '\n';
}
(注意: iostream 和 fstream 是这个有限示例所需的唯一标头。养成仅包含源所需标头的习惯)
输入文件示例
读取8个整数空格分隔:
$ cat dat/int8.txt
15815 9999 6607 32552 1479 1769 20868 6058
使用/输出示例
$ ./bin/rdpoafile dat/int8space.txt
forward:
array[0]: 15815
array[1]: 9999
array[2]: 6607
array[3]: 32552
array[4]: 1479
array[5]: 1769
array[6]: 20868
array[7]: 6058
reverse:
array[7]: 6058
array[6]: 20868
array[5]: 1769
array[4]: 1479
array[3]: 32552
array[2]: 6607
array[1]: 9999
array[0]: 15815
输入文件示例
或者读取由'\n'分隔的整数没有区别(space、'\t'和'\n'都是空格):
$ cat dat/int10.txt
19243
31875
3191
11369
22478
1783
25723
835
12093
6888
使用/输出示例
$ ./bin/rdpoafile dat/int10.txt
forward:
array[0]: 19243
array[1]: 31875
array[2]: 3191
array[3]: 11369
array[4]: 22478
array[5]: 1783
array[6]: 25723
array[7]: 835
array[8]: 12093
array[9]: 6888
reverse:
array[9]: 6888
array[8]: 12093
array[7]: 835
array[6]: 25723
array[5]: 1783
array[4]: 22478
array[3]: 11369
array[2]: 3191
array[1]: 31875
array[0]: 19243
检查一下,如果您还有其他问题,请告诉我。