带有读取文件的动态内存分配

时间:2014-09-24 05:36:14

标签: c++

我正在尝试为此项目使用动态内存。我得到一个段错误,但我无法弄清楚我做错了什么。谁能指出我的错误在哪里?该文件似乎正确读取...但我假设错误是一个流氓指针..帮助!

我只是想从一个文件中读出“heart two 2”到“spade ace 11”,所有单词都被一个空格隔开。我的程序在使用动态内存之前工作了..

#include <iostream>
#include <fstream>
#include <ctime>
#include <stdlib.h>
#include <string>

using namespace std;

//global constant(s)
const int maxCards = 52;

//Structs
struct card 
{
    char *suit;
    char *rank;
    int cvalue;
    char location;
};

void readDeck(card* deckPtr);
void cardsInit(char *finNameP,card *deckPtr);

//program
int main()
{
  card *deckPtr = new card[52];

  char *finNameP = new char[13];
  strcopy(finNameP,"cardFile.txt");
  cardsInit(finNameP,deckPtr); // function i wrote that works
  readDeck(deckPtr); //simply reads the deck from &deckPtr[0] -> &deck[51]
  delete [] finNameP;
}

void cardsInit(char *finNameP, card *deckPtr)
{
  //set up card file to be read in
  ifstream fin;
  cout << "Please enter file name...(cardFile.txt)" << endl;;
  cin >> *finNameP;
  fin.open(finNameP);

  //create pointer and set initial value
  card *deckHome = deckPtr;

  for(int i=0;i<52;i++)
  {
    (*deckPtr).suit = new char[9];
    (*deckPtr).rank = new char[9];
    deckPtr++;
  }
  deckPtr = deckHome;
  //check if cardFile.txt opens correctly
  if(!fin.good())
  {
    cout << "Error with card file" << endl;  
  }
  else
  {
    while(fin.good())
    {
      for(deckPtr = &deckPtr[0]; deckPtr < &deckPtr[maxCards];deckPtr++)
      {
        fin >> (*deckPtr).suit;
        fin >> (*deckPtr).rank;
        fin >> (*deckPtr).cvalue;
      }   
    }    
  } 

  fin.close();    
  delete []finNameP;
  delete [] (*deckPtr).suit;
  delete [] (*deckPtr).rank;
}

2 个答案:

答案 0 :(得分:2)

这是一种非常古老的编程方式。不使用new,而是使用std::stringstd::vector<char>。那些也使用动态内存,但它们使你更难以意外地导致内存分配错误。

第一个问题来自:

cin >> *finNameP; 

由于finNameP的类型为char *,因此*finNameP的类型为char。所以这条指令读取一个字符。然后你转到do fin.open(finNameP);导致未定义的行为,因为finNameP中没有字符串。

最简单的解决方法是将finNameP设为std::string。请注意,执行cin >> finNameP(不更改类型)会编译,但这是一个坏主意,因为没有缓冲区溢出保护。你可以写cin >> setw(12) >> finNameP;,但这仍然比使用字符串更糟糕。

答案 1 :(得分:0)

deckPtr < &deckPtr[maxCards]始终为true,for循环永远运行。