例如,如果外部文本文件中的数据是这样的:
45.78 67.90 87
34.89 346 0.98
如何阅读此文本文件并将每个数字分配给c ++中的变量? 使用ifstream,我可以打开文本文件并为变量分配第一个数字,但我不知道如何读取空格后面的下一个数字。
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
float a;
ifstream myfile;
myfile.open("data.txt");
myfile >> a;
cout << a;
myfile.close();
system("pause");
return 0;
}
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int data[6], a, b, c, d, e, f;
ifstream myfile;
myfile.open("a.txt");
for(int i = 0; i << 6; i++)
myfile >> data[i];
myfile.close();
a = data[0];
b = data[1];
c = data[2];
d = data[3];
e = data[4];
f = data[5];
cout << a << "\t" << b << "\t" << c << "\t" << d << "\t" << e << "\t" << f << "\n";
system("pause");
return 0;
}
答案 0 :(得分:61)
重复&gt;&gt;读入循环。
#include <iostream>
#include <fstream>
int main(int argc, char * argv[])
{
std::fstream myfile("D:\\data.txt", std::ios_base::in);
float a;
while (myfile >> a)
{
printf("%f ", a);
}
getchar();
return 0;
}
结果:
45.779999 67.900002 87.000000 34.889999 346.000000 0.980000
如果您知道完全,文件中有多少元素,您可以链接&gt;&gt;操作者:
int main(int argc, char * argv[])
{
std::fstream myfile("D:\\data.txt", std::ios_base::in);
float a, b, c, d, e, f;
myfile >> a >> b >> c >> d >> e >> f;
printf("%f\t%f\t%f\t%f\t%f\t%f\n", a, b, c, d, e, f);
getchar();
return 0;
}
编辑:回答您在主要问题中的评论。
您有两种选择。
编辑:如何跳过文件中的值
要选择第1234个值,请使用以下代码:
int skipped = 1233;
for (int i = 0; i < skipped; i++)
{
float tmp;
myfile >> tmp;
}
myfile >> value;
答案 1 :(得分:9)
它可能取决于,尤其是您的文件是否在每行上具有相同数量的项目。如果它会,那么你可能想要某种类型的2D矩阵类,通常是这样的:
class array2D {
std::vector<double> data;
size_t columns;
public:
array2D(size_t x, size_t y) : columns(x), data(x*y) {}
double &operator(size_t x, size_t y) {
return data[y*columns+x];
}
};
请注意,正如本文所述,这假设您需要预先知道您需要的尺寸。这可以避免,但代码变得更大,更复杂。
在任何情况下,要读取数字并保持原始结构,您通常一次读一行到一个字符串,然后使用字符串流从该行读取数字。这使您可以将每行的数据存储到数组中的单独行中。
如果您不知道提前的大小,或者(特别是)如果不同的行可能都不包含相同数量的数字:
11 12 13
23 34 56 78
您可能希望使用std::vector<std::vector<double> >
代替。这确实会产生一些开销,但如果不同的行可能有不同的大小,那么这是一种简单的方法。
std::vector<std::vector<double> > numbers;
std::string temp;
while (std::getline(infile, temp)) {
std::istringstream buffer(temp);
std::vector<double> line((std::istream_iterator<double>(buffer)),
std::istream_iterator<double>());
numbers.push_back(line);
}
...或者,使用现代(C ++ 11)编译器,您可以使用括号进行line
的初始化:
std::vector<double> line{std::istream_iterator<double>(buffer),
std::istream_iterator<double>()};
答案 2 :(得分:7)
数字的输入运算符会跳过前导空格,因此您只需在循环中读取数字:
while (myfile >> a)
{
// ...
}
答案 3 :(得分:0)
你可以像其他人一样单独阅读和写作。 但是如果你想写同一个,你可以试试这个:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
double data[size of your data];
std::ifstream input("file.txt");
for (int i = 0; i < size of your data; i++) {
input >> data[i];
std::cout<< data[i]<<std::endl;
}
}