3

我正在尝试编写一个 C++ 程序,但我不熟悉 C++。我有一个.txt文件,其中包含如下值:

0
0.0146484
0.0292969
0.0439453
0.0585938
0.0732422
0.0878906

我在 C++ 代码中所做的如下:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    string line;
    ifstream myReadFile;
    myReadFile.open("Qi.txt");
    if(myReadFile.is_open())
    {
        while(myReadFile.good())
        {
            getline(myReadFile,line);
            cout << line << endl;
        }
        myReadFile.close();
    }
    return 0;
}

我想让程序的输出成为一个数组,即

line[0] = 0
line[1] = 0.0146484
line[2] = 0.0292969
line[3] = 0.0439453
line[4] = 0.0585938
line[5] = 0.0732422
line[6] = 0.0878906
4

3 回答 3

8

假设您希望将数据存储为浮点数(而不是字符串),您可能想要执行以下操作:

#include <iostream>
#include <vector>
#include <iterator>
#include <fstream>

int main() { 
    std::ifstream in("Qi.txt");

    // initialize the vector from the values in the file:
    std::vector<double> lines{ std::istream_iterator<double>(in),
                               std::istream_iterator<double>() };

    // Display the values:
    for (int i=0; i<lines.size(); i++)
         std::cout << "lines[" << i << "] = " << lines[i] << '\n';
}

关于样式的简短说明:我更喜欢在创建变量时看到变量完全初始化,因此std::ifstream in("Qi.txt");std::ifstream in; in.open("Qi.txt");. 同样,最好直接从 istream 迭代器初始化行向量,而不是创建一个空向量,然后将其填充到显式循环中。

最后,请注意,如果您仍然坚持编写显式循环,那么您永远不想使用类似while (somestream.good())while (!somestream.eof())控制循环的东西——这些大部分都被破坏了,所以它们不能(可靠地)正确读取文件。根据所涉及的数据类型,他们经常会从文件中读取最后一个项目两次。通常,您需要类似while (file >> value)or的东西while (std::getline(file, somestring))。这些在读取后立即检查文件的状态,因此一旦读取失败,它们就会退出循环,避免while (good())样式问题。

哦,作为旁注:这是写的期望编译器(至少)符合 C++11。对于较旧的编译器,您需要更改:

    // initialize the vector from the values in the file:
    std::vector<double> lines{ std::istream_iterator<double>(in),
                               std::istream_iterator<double>() };

...到这样的事情:

    // initialize the vector from the values in the file:
    std::vector<double> lines(( std::istream_iterator<double>(in)),
                                std::istream_iterator<double>() );
于 2013-06-30T16:18:23.213 回答
5

首先你需要一个向量:

std::vector<std::string> lines; // requires #include <vector>

然后,您需要从getline操作中获取一个字符串,并将其推回向量中。这很简单:

for (std::string line; std::getline(myReadFile, line);) 
{
    lines.push_back(line);
}

对于输出操作,您只需要:

{
    int i = 0;

    for (auto a : lines)
    {
        std::cout << "lines[" << i++ << "] = " << a << std::endl;
    }
}
于 2013-06-30T16:07:43.953 回答
0
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
string line;
ifstream myReadFile;
myReadFile.open("Qi.txt");
if(myReadFile.is_open())
{
  for(int i=0;i<7;++i)
    if(myReadFile.good())
    {
        getline(myReadFile,line);
        cout<<"line["<<i<<"] = " << line << endl;
    }
    myReadFile.close();
}
return 0;
}
于 2017-09-16T07:30:32.600 回答