【问题标题】:C++ - How to get strings from a file to be saved as separate stringsC++ - 如何从文件中获取字符串以保存为单独的字符串
【发布时间】:2014-04-30 07:19:04
【问题描述】:

任何对此的帮助将不胜感激,因为我非常卡住。

对于这个项目,我们必须首先从文件中获取输入。 以下是文件的样子:

----------------------------------------------------------------
Hi     Then  Finish
       End   Okay

----------------------------------------------------------------

Here is the layout for it:
Character Set 1: 1-6
Character Set 2: 7 (always a space)
Character Set 3: 8-11 
Character Set 4: 12-13 (always 2 spaces)
Character Set 5: 14-19

我想知道是否有一种方法可以为字符串获取一定数量的字符。此外,每个字符集都有不同的变量。

例如:字符集 1 称为 label,字符集 3 称为 code,字符集 5 称为 operation

我尝试了类似的东西

for (int i = 0; !text.eof(); i++){
   getline(text, label[i]);
   getline(text, code[i]);
   getline(text, operation[i]);
}

如果有帮助,这里是我目前的代码......即使它不能正常工作:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main() {
  const int MAX     = 100;
  string    str;
  string    symLabel[MAX];
  string    opCode  [MAX];
  string    operand [MAX];

  ifstream sim("simprog.txt");

  for (int i = 0; !sim.eof(); i++){

    getline(sim, str);

    symLabel[i] = str.substr(0, 6);
    opCode[i]   = str.substr(8,11);
    operand[i]  = str.substr(13, 18);

    cout << symLabel[i] << endl;
    cout << opCode[i]   << endl;
  }
}

【问题讨论】:

  • 在您的示例中,第二行的标签是什么?会为空吗?
  • 是的。我相信它只是空的。它应该像一组指令。就像,如果我有第三行并且标签变量有一些东西,我希望代码像这样读取它:第 1 行有一条指令。第 2 行为空白。第 3 行有一条指令。它仍然会说标签在第三条指令上。希望这是有道理的。
  • 另外,文件的布局是固定的吗?该字段是否总是像您描述的那样具有预定宽度?
  • 是的。第一列始终为 6 个字符,一个空格,第二列为 4 个字符,最后一列为 2 个空格和 6 个字符。第一列有时只有空格。

标签: c++ file delimiter getline


【解决方案1】:

我将您的数组更改为 rec 的向量,其中 rec 是您的字符串结构,添加了复制构造函数和 operator= 以使其与 STL 容器兼容。这不会限制您使用特定数量的输入行。其余的只是对您的代码进行一些更改。

struct rec
{
    rec() { }
    rec(const rec &r) { *this = r; }
    rec &operator=(const rec &r)
    {
        if (this != &r)
        {
            symLabel = r.symLabel;
            opCode = r.opCode;
            operand = r.operand;
        }
        return *this;
    }
    std::string    symLabel;
    std::string    opCode;
    std::string    operand;
};

int main(int argc, char *argv[])
{
   std::string    str;
   std::vector<rec> records;

   std::ifstream sim("simprog.txt");

   char bf[100];
   while(sim.good())
   {
       sim.getline(bf, sizeof(bf));
       str = bf;

       rec r;
       r.symLabel = str.substr(0, 6);
       r.opCode   = str.substr(7, 5);
       r.operand  = str.substr(13, 6);

       records.push_back(r);
   }

   for (size_t i=0; i< records.size(); i++)
   {
       std::cout << records[i].symLabel << std::endl;
       std::cout << records[i].opCode   << std::endl;
   }

   return 0;
}

请注意,这需要您指定的格式正确的文件。如果行格式改变,或者最后一行不完整,你会遇到麻烦:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多