我编写的代码用于从输入文件中获取数据(它只是一列1和0)并将其转换为多个32位数字。当我知道输入文件中有多少个数字时,这很好用。我正在尝试修改它,以便它适用于我不知道大小的不同输入文件,这就是我遇到问题的地方 我的输入文件是rad。 我试过了:
java.io.IOException
不返回任何内容,
int x=0;
while(!rad.eof()) {
x++;
}
cout << x;
返回许多相同的大数字
while(!rad.eof()) {
rad >> x;
cout << x << endl;
}
返回大量零
当我知道输入文件的大小时,有效的代码是:
while(!rad.eof()) {
rad >> x;
cerr << x << endl;
}
任何帮助将不胜感激,请使用简单的语言。
答案 0 :(得分:2)
假设rad
是std::ifstream
,您可以使用seekg()
和tellg()
// std::ios_base::ate seeks to the end of the file on construction of ifstream
std::ifstream rad ("file.txt", std::ios_base::ate);
int length = 0;
if (rad) {
length = is.tellg();
is.seekg (0, std::ios_base::beg); // reset it to beginning if you want to use it
}
// .. use length
答案 1 :(得分:0)
请查看手册: http://www.cplusplus.com/reference/ios/ios/eof/
它包含如何读取数据的示例。该示例也可用于计算数据。
您可以这样重写:
std::ifstream is("example.txt"); // open file
int cnt = 0;
char c;
while (is.get(c)) // loop getting single characters
cnt++;
std::cout << "Character count in file: " << cnt;
is.close();
答案 2 :(得分:0)
无需担心流中的值数量。只需将它们复制到容器中即可。您可以检查容器的大小,但不一定需要。
#include<iostream>
#include<fstream>
#include<iterator>
#include<vector>
// and in a function somewhere, assuming rad is a valid stream
std::vector<int> data;
std::copy(std::istream_iterator<int>(rad),
std::istream_iterator(),
std::back_inserter<std::vector<int> > (data));
以上假设您要求一次读取一个int
,并将其添加到矢量中。