1

我想从文件中按行收集的数据创建一个结构。每一行都需要一个新结构,并且在 while 循环中访问这些行。在 C# 中,我通过创建匿名结构并将它们添加到结构列表中来做到这一点。C++ 似乎不允许匿名结构。我尝试用递增变量命名它们,但这不起作用,因为变量名称是按字面意思取的——无论如何,我不希望被迫使用这种方法,因为我讨厌不相关名称的想法。我想我可以用一个唯一的属性来命名这个结构,但是,显然,我宁愿使用一个属性作为。. . 一个财产。此外,如果它们不一定都是唯一的呢?

有人可以提出一些建议或解释我缺少的东西吗?

谢谢!

在 c# 中(伪:

public static List<Referral> Referrals = new List<Referral>();

//in loop:
var NewReferral = new Referral(referringURL.Trim(), referringWords.Trim().ToLower() , 1);
if ( NewReferral.URL == referringURL.Trim() )  {Referrals.Add(NewReferral);

在 C++ 中:

 list<CollectedData> AllData;

 ifstream myFile("test_data.txt");
 if (myFile.fail()) {cout << "Error opening file"; return 0;}
 else
 {
  cout << "File opened... \n";
  while( getline(myFile, line) ) {
   struct CollectedData;
                        //add property values
                        //add struct to struct list
  }
 }

(请详细说明它们何时自动删除,可能不会有帮助,但我想知道。谢谢!)

4

4 回答 4

9

除了两件事之外,您的 C++ 看起来是在正确的轨道上。一,您必须在某处定义 CollectedData 结构的形式,二您必须为您的结构变量命名:

例如,如果您像这样定义 CollectedData 结构

struct CollectedData {
  int field1;
  std::string field2;
  bool field3;
  // etc
};

然后在你的内部循环中你可以这样做

while( getline(myFile, line) ) {
                CollectedData lineData;
                 //add property values
                 lineData.field1 = /*whatever*/;
                 lineData.field2 = /*whatever*/;
                 lineData.field3 = /*whatever*/;
                 //add struct to struct list
                 AllData.push_back(lineData);
        }

每次循环都会创建一个新的 CollectedData 对象,并填写其字段,然后将其副本推送到 AllData 列表中,最后自动销毁该对象(记住列表中仍然存在副本)。

关于对象何时被破坏的详细信息

C++ 具有三种存储方式:静态、自动和动态。

静态存储对象存在于程序的整个生命周期中。在类或函数之外创建的任何对象都是静态的(即全局对象是静态的)。使用 'static' 关键字在类或函数内部声明的任何内容也是如此。

动态存储对象是使用关键字“new”(或使用 malloc() 创建的对象,但这是一种 C 主义,在 C++ 中通常应避免使用,除非确实有必要)。动态存储对象是其生命周期由程序员手动管理的对象。动态存储的对象将继续存在,直到您使用关键字“delete”将其销毁。请注意,访问动态存储对象的唯一方法是通过指针或引用。如果您不使用指针或引用,则它不是动态的(但指针/引用也可以引用非动态对象)。

自动存储对象是您的常规变量:结构和类的成员变量,以及方法和函数中的局部变量(包括参数)。

定义在函数内部的自动存储对象是在定义它们的代码行运行时创建的。当它们“超出范围”时,它们会自动销毁,也就是说,当它们在其中声明的块终止时。通常,“块”是一组大括号:{}。因此,当函数返回时,在函数内部创建的任何内容都会被销毁,同样,在循环结束时,在 while 循环体内创建的任何内容都会自动销毁(无论它是终止还是再次迭代)。

定义为类或结构成员的自动存储对象在创建包含它们作为成员的对象时创建,并在包含它们作为成员的对象被销毁时销毁。

(我在上面重复使用了术语“对象”,但同样的规则适用于基本类型,如 int、char、bool 等)

于 2009-08-31T00:57:37.173 回答
1

你的问题有点不清楚你在问什么。我推断您的意思是每个结构的每一行都有相同的字段,就像 SQL 数据库中的列一样。这意味着文件中的每一行都没有不同的结构定义。

所以,假设你所有的结构都有相同的字段,工作很简单;只需为您的结构定义一个复制构造函数,然后您可以将它们添加到一个std::vector或一个std::list或您自己的数组/列表/双端队列/任何实现中。

struct mystruct
{ 
  int a,b,c;
  // has default (shallow-copy) constructor, coz that's fine for integral types...
}

void readfromfile( YourFileClass *pFile, /* etc.. */ )
{
   mystruct temp;
   std::list<mystruct> result;
   // read each line into the temp struct one at a time, add to a list
   while ( pFile->ReadNextFileLineIntoStruct( &temp ) )
   {
      result.push_back( temp );
   }
   // result has a linked list of data...
}

您还可以new每次通过循环启动结构的实例,并将指向这些结构的指针添加到列表中(如 Smashery 建议的那样),但请注意,当列表被删除时,这些对象不会被释放- 您将需要循环遍历整个列表并delete在完成后调用每个条目,否则您将无法挽回地泄漏内存。

(你也可以创建一个继承std::list并正确释放其析构函数中的每个条目的类,但如果你不知道自己在做什么,这就进入了危险的领域。)

于 2009-08-31T00:55:50.773 回答
0

C++ 中的Astruct是一种数据结构,其整个“结构”(布局、成员、成员类型)是在编译时定义的。

您是否可能想要类似哈希表(或其他关联/类似地图的数据结构)之类的东西,在文件的每一行,例如数组中,您有这些结构之一?

于 2009-08-31T00:51:17.810 回答
0

C++ 中没有匿名类型这样的东西。您必须明确定义行结构,然后必须定义表示行集合的数据结构。

于 2009-08-31T00:58:53.100 回答