【问题标题】:What's making this algorithm crash? [closed]是什么让这个算法崩溃? [关闭]
【发布时间】:2016-08-23 20:46:15
【问题描述】:

在准确显示代码之前,让我详细解释一下问题。 我需要创建 2 个 dat 文件,其中包含一些关于酒店的数据。其中一个文件包含以下信息:酒店所在省份的名称(16 字符串)、酒店类别(int)、酒店代码(int)、酒店名称(30 字符串)、金额房间数 (int) 和当前预订房间数 (int)。第二个 dat 文件包含从列表中删除的酒店的代码。测试的最后一部分是创建一个文件,其中包含其余酒店的所有信息。因为,理论上,如果 2 个第一个 dat 文件,我已经有了信息,所以我只写了一些简单的东西。值得一提的是,我必须使用 dev c++ 4.9.9.2:

#include <iostream>
#include <cmath>
#include <fstream>
#include <string.h>
#include <cstdio>

using namespace std;


struct rhot
{      
   char provincia[16];
   int categoria;
   int chot;
   char nombrehotel[30];
   int canthabitaciones;
   int habitreservadas;
};

int main()
{
rhot hot1 =
{    
 "Còrdoba",
 4,
 1,
 "La pachamama",
 100,
 49
 };
rhot hot2 =
{    
 "Salta",
 3,
 2,
 "Puntoblanco",
 60,
 13
 };
rhot hot3 =
{    
 "Catamarca",
 4,
 3,
 "Jaguar Resort",
 250,
 197
 };
rhot hot4 =
{    
 "Chubut",
 6,
 4,
 "Llao Llao",
 300,
 299
 };
rhot hot5 =
{    
 "La pampa",
 2,
 5,
 "Gaunchito",
 40,
 20
 };
rhot hot6 =
{    
 "Mendoza",
 3,
 6,
 "Queseyo",
 60,
 13
 };


FILE* f1;
 f1 = fopen("Arhot.dat", "w");

fwrite(&hot1,sizeof(hot1),1,f1); 
fwrite(&hot2,sizeof(hot2),1,f1); 
fwrite(&hot3,sizeof(hot3),1,f1); 
fwrite(&hot4,sizeof(hot4),1,f1); 
fwrite(&hot5,sizeof(hot5),1,f1); 
fwrite(&hot6,sizeof(hot6),1,f1); 

fclose(f1);  

system("PAUSE");
return EXIT_SUCCESS;
}

第二个:

 #include <iostream>
 #include <cmath>
 #include <fstream>
 #include <string.h>
 #include <cstdio>

using namespace std;


struct Rbaja
{      
   int Cbajas;
 };

int main()
{
Rbaja Baja1 =
{    
 1
 };
Rbaja Baja2 =
{    
 5
 };



FILE* f1;
f1 = fopen("Arbaj.dat", "w");

fwrite(&Baja1,sizeof(Baja1),1,f1); 
fwrite(&Baja2,sizeof(Baja2),1,f1); 


fclose(f1);  

system("PAUSE");
return EXIT_SUCCESS;
}

(我还想提一下,我不知道我真正需要哪些库,我尝试删除它们中的每一个并运行程序,即使它没有库也没有给我任何错误,所以只是因为我不知道该怎么办,我把它们都放在那里了)

现在我正在努力完成这项工作。我需要阅读上面创建的 2 个文件,并尝试根据我一开始所说的创建一个。但是我几乎没有写一个 fread 函数,每当我编译和运行它时它就会崩溃

#include <iostream>
#include <cmath>
#include <fstream>
#include <string.h>
#include <cstdio>
#include <cstdlib>


using namespace std;
 FILE* fileArhot;
 FILE* fileArbaj;
 FILE* fileAract;

struct rhot
{      
       char provincia[16];
       int catergoria;
       int chot;
       char nombrehotel[30];
       int cantahibaticones;
       int habitreservadas;
};

struct rbaja
{      
       int Cbajas;
};

struct rhotact
{      
       char provincia[16];
       int catergoria;
       int chot;
       char nombrehotel[30];
       int cantahibaticones;
       int habitreservadas;
};

int main()
{
fileArhot =fopen("Arhot.dat","r");
fileArbaj =fopen("Arbaj.dat","r");
fileAract =fopen("Aract.dat","w");

fread(&fileArhot,sizeof(rhot),1,fileArhot);
fread(&fileArbaj,sizeof(rbaja),1,fileArbaj);


 fclose(fileArhot);
 fclose(fileArbaj);
 fclose(fileAract); 
 system("PAUSE");
 return EXIT_SUCCESS;
}

每当我尝试运行它时,程序就会崩溃。我认为它是因为它在做一个无限循环之类的,但我不知道。我包含了 2 个 dat 文件的创建代码,因为我可能创建错了。

无论如何,我需要一些帮助:D (如果文本是西班牙语,我也很抱歉,我来自阿根廷,我需要用西班牙语做代码。)

【问题讨论】:

  • 1.你为什么不发布输入文件的文本,而不是你用来创建它们的代码? 2. 您是否尝试过使用调试器来单步调试代码并查看它在哪一行崩溃?
  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。

标签: c++ file crash fread


【解决方案1】:

您将错误的参数传递给fread

fread(&fileArhot,sizeof(rhot),1,fileArhot);

覆盖fileArhot,并且未定义。

您还忘记声明要读取的变量。

应该是

rhot an_rhot; // or whatever you want to name it
fread(&an_rhot, sizeof(rhot), 1, fileArhot);

或者稍微安全一点的

fread(&an_rhot, sizeof(an_rhot), 1, fileArhot);

其他读取类似。

您还应该添加一些检查以验证您是否已成功打开、读取和写入文件。

我建议您考虑使用 C++ I/O 而不是 C 库,因为它更安全。

【讨论】:

  • fread(&amp;rhot,sizeof(rhot),1,fileArhot); fread(&amp;rbaja,sizeof(rbaja),1,fileArbaj); 这让我读到“,”的错误(“,”标记之前的预期主要表达式)
  • @Loquen 我误读并认为rhot 是一个变量而不是一个类型。我更新了答案。 (顺便说一句,您在其他两个程序中都正确地做到了这一点。)
猜你喜欢
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
相关资源
最近更新 更多