2016-04-16 2 views
-1

я пишу указатель на символ в файл, но моя программа всегда падает на имя, когда я это сделать, и я не в состоянии понять, почемуне может записать указатель файла полукокса

#include <iostream> 
#include <iomanip> 
#include <string> 
#include "AmaProduct.h" 

using namespace std; 
namespace sict{ 
AmaProduct::AmaProduct(char file){ 
    fileTag_ = file; 
} 
const char* AmaProduct::unit()const{ 
    return unit_; 
} 
void AmaProduct::unit(const char* value){ 
    for (int i = 0; i != 9; i++){ 
     unit_[i] = value[i]; 
    } 
    unit_[11] = 0; 
} 
fstream& AmaProduct::store(fstream& file, bool addNewLine)const{ 
    file.open("file.txt"); 
    if (file.is_open()){ 
     file << fileTag_ << "," << sku() << ","; 
     file<< name() << ",";//here 
     file<< price() << "," << taxed() << "," << quantity() << "," << unit_ << "," << qtyNeeded(); 
     if (addNewLine){ 
      file << endl; 
     } 
    } 
    file.close(); 
    return file; 
} 

заголовочный файл

#ifndef SICT_AMAPRODUCT_H__ 
#define SICT_AMAPRODUCT_H__ 
#include "Streamable.h" 
#include "Product.h" 
#include "Date.h" 
#include "ErrorMessage.h" 
#include "general.h" 
#include <iostream> 
#include <fstream> 

namespace sict{ 
class AmaProduct : public Product{ 
private: 
    char fileTag_; 
    char unit_[11]; 
protected: 
    ErrorMessage err_; 
public: 
    AmaProduct(char file='N'); 
    const char* unit()const; 
    void unit(const char* value); 
    fstream& store(fstream& file, bool addNewLine = true)const; 
    fstream& load(std::fstream& file); 
    ostream& write(ostream& os, bool linear)const; 
    istream& read(istream& is); 
}; 
} 

имя()

const char* Product::name()const{ 
    return name_; 
} 
char* name_; 
void Product::name(char* name){ 
    delete[] name_; 
    name_= new char[strlen(name)+1]; 
    strcpy(name_,name); 
} 

если кто-то заинтересован в других файлах я буду загружать их слишком

+1

Меня не беспокоит чтение всего этого кода. Но читаете ли вы файл и используете тот же указатель –

+1

_ «если кто-то заинтересован в других файлах, я их выгружу» _ Пожалуйста, нет! Уменьшите образец до [MCVE]. Пройдите через свой код с помощью отладчика. –

+0

Что такое 'name()'? –

ответ

1

Есть несколько возможностей, но если cout<<name() вызывает ошибку сегментации, наиболее вероятные случаи:

  • name_ еще nullptr
  • name_ является недопустимым указателем (например, если вы скопировали структуру, который не уважает rule of 3)

Чтобы сделать код более надежным, вы можете изменить все char*, их утомительные распределения памяти и с-стиль строковые операции с string.

Если вы этого не сделаете, обязательно соблюдайте правило 3, чтобы избежать мелкой ошибки копирования и указателя при копировании или копировании структуры вашей структуры и убедитесь, что при использовании массива с фиксированным размером вы уверены не переполнить буфер

Следует также отметить, что при этом, может переполнить буфер:

file.getline(n, ','); 
    name(n); 

потому что istream::getline(), когда она имеет два аргумента, принимает в качестве второго аргумента размер (здесь 44, значение ASCii из запятая). file.getline(n, 7, ',') будет правильной формой.

+0

благодарю вас за ответ, но я также показал, как я назначаю имя (n); –

+0

Я отредактировал мой ответ соответственно – Christophe

+0

спасибо/10char –

Смежные вопросы