C++ 将文件读入数组并输出数组C++; #包括 #包括 #包括 #包括 使用名称空间std; int main() { ifstream inData(“Text.txt”); 流输出数据(“arrayout.txt”); int n=0; int-num; int数组[10]; 而(!inData.eof()) { inData>>数组[n]; n++; } 对于(int a=0;acurrentNumber) { 数字。推回(当前数字); i++; } cout
这个C++ 将文件读入数组并输出数组C++; #包括 #包括 #包括 #包括 使用名称空间std; int main() { ifstream inData(“Text.txt”); 流输出数据(“arrayout.txt”); int n=0; int-num; int数组[10]; 而(!inData.eof()) { inData>>数组[n]; n++; } 对于(int a=0;acurrentNumber) { 数字。推回(当前数字); i++; } cout,c++,arrays,file,C++,Arrays,File,这个cout数组[n];++n) {} (当然,格式化这样一个循环有多种方法),但退出条件应该是读取失败,并且重要的是不要超出存储的界限。您已经从注释中了解到了这一点 如果您的教授要求您使用POA(普通旧数组)而不是容器(例如),则负责所有边界检查,以将读取的元素限制为不超过声明保留的数组的元素数,并在读取的元素少于容器将保留的元素数的情况下保留读取的元素数的有效索引 基本上,你是在使用C++ + IoSoW填充一个普通的C数组来进行输入处理。对于初学者,不要使用魔法数字,不要硬编码文件名。
cout数组[n];++n)
{}
(当然,格式化这样一个循环有多种方法),但退出条件应该是读取失败,并且重要的是不要超出存储的界限。您已经从注释中了解到了这一点
如果您的教授要求您使用POA(普通旧数组)而不是容器(例如),则负责所有边界检查,以将读取的元素限制为不超过声明保留的数组的元素数,并在读取的元素少于容器将保留的元素数的情况下保留读取的元素数的有效索引
<>基本上,你是在使用C++ + IoSoW填充一个普通的C数组来进行输入处理。对于初学者,不要使用魔法数字,不要硬编码文件名。
for (n = 0; n < 10 && inData >> array[n]; ++n )
{}
而接受参数的main()
的正确原型是intmain(intargc,char**argv)
(或者*argv[]
,如果您喜欢等效的指针数组)。您现在可以将要读取的文件名作为第一个参数传递给程序,而不必重新编译代码来读取另一个文件。要将该参数用作要读取的文件名,只需验证命令行上是否提供了足够数量的参数即可(正在运行的程序的名称始终是第一个参数,argv[0]
,因此第一个用户参数是argv[1]
),例如
现在,您已经将ndx
元素读取到数组中,所以您需要做的就是以正向和反向顺序输出它们。您可以通过在反向情况下循环0i>=0
来实现这一点,例如
/* protect plain-old array bounds && validate integer input */
while (ndx < ARRSZ && fin >> array[ndx])
ndx++; /* increment index on success */
示例使用/输出
$ cat dat/int8.txt
15815 9999 6607 32552 1479 1769 20868 6058
$ cat dat/int10.txt
19243
31875
3191
11369
22478
1783
25723
835
12093
6888
示例输入文件
或者读取由'\n'
分隔的整数没有任何区别(空格
,'\t'
和'\n'
都是空白):
示例使用/输出
$ cat dat/int8.txt
15815 9999 6607 32552 1479 1769 20868 6058
$ cat dat/int10.txt
19243
31875
3191
11369
22478
1783
25723
835
12093
6888
仔细检查一下,如果你还有其他问题,请告诉我
n
呢?只需使用std::vector即可。如果数据文件的大小始终为10,则可能是第二个循环中的键入错误n=10,则将array[n]
更改为array[a]
array[n]
超出边界
在输入文件中,数字是如何分隔的?每行是否有一个数字?或者它们是否都在同一行上,由某个删除字符分隔?请编辑您的问题以澄清这一点。正如旁注:重复的@Drewster301,则您的文件要么未正确打开,要么文件中有10个以上的数字。请说明您是如何操作的已验证文件已打开。如果(!inData)抛出“inData未打开”,则添加
;如果(!outData)抛出“outData未打开”,则添加
在int n=0
之前,查看程序在执行时是否会向您发送错误消息。@walnut,好的,我更改了代码中非常简单的一部分,现在在打印数字的循环中。我只是将for循环中的n改为a。这件事可能会让人非常沮丧。。。
#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';
}
$ 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
$ 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