C++ 错误:运行时检查失败#2-变量周围的堆栈已损坏

C++ 错误:运行时检查失败#2-变量周围的堆栈已损坏,c++,C++,我试图从.text文件中读取一个结构,然后将其保存到一个新的文本文件中,以查看它是否有效,但在保存时,出现了一个臭名昭著的错误:“运行时检查失败#2-变量“pers”周围的堆栈已损坏”。 我不知道我应该给struct person多大的尺寸才能让它工作。 这是.txt文件: 米里奥·托加塔 18937332 1951年7月15日 富村茂垣 17304739 1930年11月24日 这是代码: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h

我试图从.text文件中读取一个结构,然后将其保存到一个新的文本文件中,以查看它是否有效,但在保存时,出现了一个臭名昭著的错误:“运行时检查失败#2-变量“pers”周围的堆栈已损坏”。 我不知道我应该给struct person多大的尺寸才能让它工作。 这是.txt文件:

米里奥·托加塔

18937332

1951年7月15日

富村茂垣

17304739

1930年11月24日

这是代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define LNOM 32
#define TAM 2 /*The size I established for the struct persona is 2 because there are 2 people*/

struct fecha { int d, m, a; };
struct persona
{
  char nombre[LNOM];
  int dni;
  struct fecha nacim;
};

int readText(struct persona l[], int cant)
{
  printf("Leyendo...\n");
  char nom[LNOM];
  FILE *pf = fopen("persona.txt", "r");
  if (pf)
  {
    fgets(nom, LNOM, pf);
    while (!feof(pf))
    {
        strcpy(l[cant].nombre, nom);
        fscanf(pf, "%d", &l[cant].dni);
        fgetc(pf);
        fscanf(pf, "%d/%d/%d", &l[cant].nacim.d, &l[cant].nacim.m, &l[cant].nacim.a);
        fgetc(pf);
        cant++;
        fgets(nom, LNOM, pf);
    }
    fclose(pf);
  }
return cant;
}

void saveText(struct persona l[], int cant)
{
  printf("Grabando...\n");
  int i;
  FILE *pf = fopen("personados.txt", "w");
  if (pf)
  {
    for (i = 0; i < cant; i++)
    {
        fprintf(pf, "%s\n", l[i].nombre);
        fprintf(pf, "%d\n", l[i].dni);
        fprintf(pf, "%d/%d/%d\n", l[i].nacim.d, l[i].nacim.m, l[i].nacim.a);
    }
    fclose(pf);
  }
}

int main(void)
{
  int cant = 0;
  struct persona pers[TAM];
  cant = readText(&pers[TAM],cant);
  saveText(&pers[TAM],cant);
  return 0;
}
\define\u CRT\u SECURE\u NO\u警告
#包括
#包括
#定义LNOM 32
#define TAM 2/*我为struct persona建立的大小是2,因为有2个人*/
结构fecha{int d,m,a;};
结构人物
{
字符名称[LNOM];
int dni;
结构fecha-nacim;
};
int readText(结构人物l[],int超文本)
{
printf(“Leyendo…\n”);
字符名称[LNOM];
FILE*pf=fopen(“persona.txt”、“r”);
if(pf)
{
fgets(nom、LNOM、pf);
而(!feof(pf))
{
strcpy(l[铁路超高]。标称,标称);
fscanf(pf、%d、&l[cant].dni);
fgetc(pf);
fscanf(pf,“%d/%d/%d”、&l[cant].nacim.d、&l[cant].nacim.m、&l[cant].nacim.a);
fgetc(pf);
cant++;
fgets(nom、LNOM、pf);
}
fclose(pf);
}
回程超高;
}
void saveText(struct persona l[],int-cant)
{
printf(“Grabando…\n”);
int i;
文件*pf=fopen(“personados.txt”,“w”);
if(pf)
{
对于(i=0;i

提前感谢。

首先是数组索引的复习

pers[0]
pers
中提供第一个
person

pers[1]
将提供第二个,并且

pers[2]
将是第三个。这个序列可以持续一段时间,但是因为

#define TAM 2
将用所有
TAM
s替换2

struct persona pers[TAM];
变成

struct persona pers[2];
pers[2] 
因此
pers
只有两个有效条目。这也意味着

pers[TAM] 
变成

struct persona pers[2];
pers[2] 
我们在上面看到的是
pers
中的第三个元素,现在我们知道
pers
中没有第三个元素

pers[1]
所以

获取不存在的
pers
第三个元素的地址,并将其作为
l
传递到
readText
中。由于
l
指向
pers
的有效范围之外,读取
l
指向的元素将损坏堆栈并导致错误消息


解决方案是读入
pers
pers[0]
pers[1]
的有效元素。因为两个条目将从代码中读取,代码<> Read Trime/Cuff>,从Pes(1)< /C>开始,不推荐阅读元素2,不推荐不存在元素3。< /P>请使用实际的C++习语代替C语言,尽管工作非常容易出错,正如你刚才注意到的。你认为这个代码> LeReXTTO(和)
是吗?
而(!feof(pf))
是一个。感谢您的帮助,我编写了cant=readText(&pers[0],cant);而不是cant=readText(&pers[TAM],cant);现在它可以工作了perfectly@Kuroki在此基础上有一个小小的改进,因此您可以编写
cant=readText(pers,cant);