我有一个名为 in.txt 的文本文件,每行都有一个整数。第一行包含行数减1(=整数)。我想把这个整数读成数组。所以我写了下面的程序:
#include <iostream>
#include <fstream>
int main(int argc, char * argv[])
{
std::fstream myfile("in.txt");
int number;
int counter=0;
myfile >> number;
int inputArray[number];
for(counter=0;counter=number;counter++)
{
myfile>>inputArray[counter];
}
for(counter=0;counter=number;counter++){
printf("%i",inputArray[counter]);
}
return 0;
}
Q1:当我运行它时,没有任何反应!出现黑屏并保持空白。有什么问题?
Q2:如果输入文件非常大(包含大约2 ^ 27个整数),这个程序是个好主意,还是我必须做其他事情?
答案 0 :(得分:4)
您的代码有几个问题:
首先,您无法检查输入操作是否成功。做点什么
if (! (myfile >> number)) {
std::cerr << "Reading number failed!\n";
return -1;
}
用于每个输入操作。否则,您可能会使用垃圾值,这可能会导致奇怪且很难找到错误。
接下来,C ++中没有可变大小的数组,而是使用std::vector<int> inputArray(number);
。这会将整个数组初始化为0
,这可能需要一些时间,您可以将代码更改为
std::vector<int> inputArray;
inputArray.reserve(number);
for(int64_t counter=0;counter<number;counter++)
{
int temp;
myfile>>temp;
inputArray.push_back(temp);
}
避免这种情况。
最后,您的循环条件错误。他们应该是
for(counter=0;counter<number;counter++)
如果数字的数量可能很大,您应该使用固定大小的整数,例如int64_t
,而不是number
。
这是一个好主意吗?嗯,这是一种读取数字的有效方法,但读取2 ^ 27个数字总是需要花费很多时间。如果你能避免这样做,那么这是你加快速度的最大机会。
作为最后一点,以下是我将如何编写带错误处理的输入操作以及所有:
for (int temp; myFile >> temp;)
inputArray.push_back(temp);
if( inputArray.size() != number)
std::cerr << "Number of numbers read did not match number in first line!\n";
答案 1 :(得分:2)
看起来这一行有一个拼写错误:
for(counter=0;counter=number;counter++)
应该是:
for(counter=0; counter < number; counter++)
您在下一个for
循环中遇到同样的错误。
答案 2 :(得分:1)
试试这个:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char * argv[])
{
std::fstream myfile("in.txt", ios::in | ios::out);
int number;
int counter = 0;
myfile >> number;
int *inputArray = new int[number];
for (counter = 0; counter != number; counter++){
myfile >> inputArray[counter];
}
for (counter = 0; counter != number; counter++){
printf("%i", inputArray[counter]);
}
delete[] inputArray;
return 0;
}
我认为二进制文件对于大量数据更好。