繁体   English   中英

如何在C ++中从文件读取乘法字符数组

[英]How to read multiply char arrays from a file in C++

文件“ Athlete info.txt”如下所示:

Peter Gab 2653 Kenya 127

Usain Bolt 6534 Jamaica 128

Bla Bla 2973 Bangladesh -1

Some Name 5182 India 129

我希望我的代码执行的操作是读取第一个字符串并将其分配给firstName数组(例如,将Peter存储在firstName[0] ),读取第二个字符串并将其分配给lastName数组(例如,将Gab存储在lastName[0] )等等。我尝试了许多不同的方法,甚至尝试将其全部设置为字符串数组,但是它不起作用。 如果有人可以告诉我代码中有什么问题或如何解决,那太好了!

提前致谢!

void readInputFromFile()
    {
        ifstream inputData;
        inputData.open("Athlete info.txt");

        const int SIZE=50;
        char firstName[SIZE],
             lastName[SIZE],
             athleteNumber[SIZE],
             country[SIZE];
        int  athleteTime[SIZE];

        int numOfCharacters=0;

        if (inputData.is_open())
        {
            int i=0;

            while(!inputData.eof())
            {
                inputData >> firstName[i]; 
                inputData >> lastName[i]; 
                inputData >> athleteNumber[i];
                inputData >> country[i]; 
                inputData >> athleteTime[i];
                i++;
                numOfCharacters++;
            }

            for (int i=0; i < numOfCharacters; i++ )
            {
                cout << "First Name: " << firstName[i];
                cout << "Last name: " << lastName[i];
                cout << "AthleteNumber: " << athleteNumber[i];
                cout << "Country: " << country[i];
                cout << "Time taken: " << athleteTime[i];
                cout << endl;
            }

        }
        else
        {
            cout << "ERROR" << endl;
        }
        inputData.close();
    }

首先,您正在使用c ++,所以让我们使用std :: string并使用类。 让我们创建一个运动员结构,其中包含运动员所需的一切:

struct Athlete {
    Athlete() = default;
    Athlete(std::stringstream &stream) {
        stream >> firstName 
               >> lastName 
               >> athleteNumber 
               >> country 
               >> athleteTime;
    }
    // every Athlete is unique, copying should be prohibited
    Athlete(const Athlete&) = delete;

    std::string firstName;
    std::string lastName;
    std::string athleteNumber;
    std::string country;
    std::string athleteTime;
}

也许您可以多做一些工作并将其封装得更好。

现在我们将使用std :: vector来存储运动员,并且每次我们push_back时,都会使用输入文件中的读取行来调用Athelete构造函数。 稍后,您可以使用基于范围的for循环来访问vector中的每个运动员。 还要注意,如果不手动关闭ifstream,则一旦对象超出范围,它将自动关闭。

void readInputFromFile() {
   ifstream inputData("Athlete info.txt");
   std::vector<Athlete> athletes;

   std::string line;
   std::stringstream ss;

   if (inputData.is_open() {
      while (getline(inputData, line)) {
         ss.str(line);
         // directly construct in-place
         athletes.emplace_back(ss);
      }

      for (const Athlete& a : athletes) {
         /* ...*/
      }
   } else {
      std:cerr << "ERROR" << std::endl;
   }
}

最简单的更改是

while(inputData >> firstName[i])
{
    inputData >> lastName[i]; 
    inputData >> athleteNumber[i];
    inputData >> country[i]; 
    inputData >> athleteTime[i];
    i++;
    numOfCharacters++;
}

这将取决于输入的格式正确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM