2014-09-24 69 views
-3

我想为这个项目使用动态内存。我遇到了seg错误,但我无法弄清楚我做错了什么。任何人都可以指出我的错误在哪里?该文件似乎正确阅读...但我假设错误是一个流氓指针..帮助!动态内存分配与读取文件在

我只是想从一个文件中读取“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; 
} 
+3

'strcopy'不是什么东西。确保你复制粘贴你的代码而不是重新输入 – 2014-09-24 05:38:59

+0

它是我写的一个函数。感谢您的毫无价值的回复 – matt 2014-09-24 05:41:03

+0

你不会看400行代码..:/ – matt 2014-09-24 05:47:11

回答

0

deckPtr < &deckPtr[maxCards]永远是真的,for循环永远运行。

2

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

第一个问题来这里:

cin >> *finNameP; 

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

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

+0

我知道这是一个荒谬的方式来编程,但即时通讯需要为这个项目 – matt 2014-09-24 05:48:05