2016-04-16 2 views
-1

Ich bin ein Zeichenzeiger in eine Datei zu schreiben, aber mein Programm stürzt immer auf Namen, wenn ich es tun, und ich bin nicht in der Lage, warumnicht in der Lage zu einer Datei char Zeiger schreiben

#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; 
} 

Header-Datei

, um herauszufinden,
#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); 
}; 
} 

Name()

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); 
} 

wenn jemand interessiert sich für die anderen Dateien ich werde sie laden zu

+1

Ich kann nicht mit dem Lesen dieses ganzen Codes belästigt werden. Aber lesen Sie die Datei und verwenden Sie den gleichen Zeiger –

+1

_ "Wenn jemand an den anderen Dateien interessiert ist, werde ich sie auch hochladen" _ Bitte nein! Reduziere deine Probe auf [MCVE]. Durchlaufen Sie Ihren Code mit dem Debugger. –

+0

Was ist 'name()'? –

Antwort

1

Es gibt mehrere Möglichkeiten, aber wenn cout<<name() einen Segmentierungsfehler verursacht, die wahrscheinlichsten Fälle sind:

  • name_ noch nullptr ist
  • name_ ein ungültiger Zeiger ist (zum Beispiel, wenn Sie Ihre Struktur kopiert, die nicht die rule of 3 nicht respektiert)

Um Ihren Code zuverlässiger zu machen, könnten Sie alle char* ändern, ihre mühsamen Speicherzuordnungen und den c-Stil Zeichenkettenoperationen mit string.

Wenn Sie dies nicht tun, achten Sie darauf, die Regel 3 zu beachten, um Probleme mit flachen Kopien und Zeigern beim Kopieren oder Kopieren Ihrer Struktur zu vermeiden, und stellen Sie sicher, dass Sie ein Char Array fester Größe verwenden nicht den Puffer

Beachten sie auch, überzuzulaufen, dass dies zu tun, den Pufferüberlauf könnte: die Größe

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

weil istream::getline(), wenn es zwei Argumente hat, nimmt als zweites Argument (hier 44, den ASCII-Wert das Komma). file.getline(n, 7, ',') wäre die richtige Form.

+0

danke für dich antwort, aber ich zeigte auch, wie ich name (n) zuweisen; –

+0

Ich habe meine Antwort entsprechend bearbeitet – Christophe

+0

danke/10char –

Verwandte Themen