Supprimer ligne spécifique à partir d'un fichier
J'essaie de supprimer une ligne spécifique par id à partir d'un fichier en C++ et voici mon code:
void deleteRow()
{
ifstream inDb("files/students.dat", ios::in);
if(!inDb)
{
cerr << "File could no be opened!\n";
}
cout << countRowsOfDb() << " records." << endl;
Student *studentsArray[countRowsOfDb()];
int n = 0;
while(inDb >> id >> name >> grade >> points >> type)
{
studentsArray[n] = new Student(id, name, grade, points, type);
n++;
}
inDb.close();
for(int i = 0; i < countRowsOfDb(); i++)
{
cout << studentsArray[i]->id << " " << studentsArray[i]->name << " " << studentsArray[i]->grade << " "
<< studentsArray[i]->points << " " << studentsArray[i]->type << "\n";
}
cout << "\nWhich one you would like to delete? Enter an id: ";
string term;
cin >> term;
ofstream outDb("files/students.dat", ios::out);
if(!outDb)
{
cerr << "File could no be opened!\n";
}
for(int i = 0; i < countRowsOfDb(); i++)
{
if(studentsArray[i]->id != term)
{
outDb << studentsArray[i]->id << " " << studentsArray[i]->name << " " << studentsArray[i]->grade << " "
<< studentsArray[i]->points << " " << studentsArray[i]->type << "\n";
}
}
outDb.close();
cout << "\nObject deleted!\n";
}
J'ai créer un fichier d'entrée de flux et puis obtenir toutes les lignes, faire tableau d'objets et de les afficher sur l'écran, puis demander lequel supprimer en tapant un code et quand je tape le code, je suis en train de mettre tous ces éléments de la matrice seule, sans l'élément avec le même id, mais il ne fonctionne pas, après cela, il n'y a rien dans le fichier. Des idées?
Quelles sont les valeurs de studentsArray[i]->id, et à terme sur la ligne que vous attendez pour les supprimer?
Vous avez une fuite de mémoire de ne pas
studentsArray[i]->id, et à terme sont des chaînes de caractères et si elles sont identiques à l'élément avec l'id sera ignorée
countRowsOfDb() est une fonction qui retourne int et il ne peut pas être constante car les lignes peuvent être supprimées ou ajoutées à tout moment.. ?
Vous avez une fuite de mémoire de ne pas
delete
ing chaque élément de votre groupe. Essayez std::vector
.Student *studentsArray[countRowsOfDb()];
Comment cette compilation? Ne devrait pas la taille de la matrice être une compilation constante de temps?studentsArray[i]->id, et à terme sont des chaînes de caractères et si elles sont identiques à l'élément avec l'id sera ignorée
countRowsOfDb() est une fonction qui retourne int et il ne peut pas être constante car les lignes peuvent être supprimées ou ajoutées à tout moment.. ?
OriginalL'auteur fre2ak | 2012-06-13
Vous devez vous connecter pour publier un commentaire.
Ce qui est dans
countRowsOfDb()
? Si on ouvre le fichier et compte le nombre de lignes(et je ne sais pas quoi d'autre il pourrait le faire), alors il ne va pas
trouver beaucoup dans la dernière boucle, depuis la création de la ostream avec l'
même nom aura vidé le fichier.
Plus généralement, c'est une voie très inefficace de faire les choses (et
pourrait facilement échouer si il y avait une erreur dans le format du fichier).
La meilleure façon de gérer cela est d'utiliser un
std::vector<Student>
, avec:dans la boucle d'entrée. Dans toutes les boucles plus tard,
studentVector.size()
donne l'nombre d'entrées, ou vous pouvez utiliser les itérateurs.
Encore mieux serait d'utiliser
std::getline
sur led'entrée, puis initialiser un
std::istringstream
à analyser chaque ligne. Cetteva attraper le format d'entrée d'erreurs beaucoup plus fiable. Quelque chose comme:
Aussi, il est généralement préférable de l'écrire sur fichier séparé, puis
renommer après avoir vérifié que l'écriture a travaillé, c'est à dire:
Et bien sûr, toute erreur d'écriture devrait entraîner un retour de
EXIT_FAILURE
demain
. (Ceci est un cas où une variable globaleou un singleton est justifié d'en suivre le code de retour.)
OriginalL'auteur James Kanze
Je l'ai fait de travailler par l'ajout d'une nouvelle fonction qui rejoue le contenu, de sorte que maintenant le code est:
et le remplacement de la fonction est:
"files/students.dat" in
replaceRow, you truncate the file. So only the last call to
replaceRow " doit être présent après l'exécution de votre programme.je pense que je suis dans le mauvais sens et je vais essayer que thig avec les vecteurs..
puis-je vous demander plus de choses sur l'ensemble du programme?
Mais bien sûr..
je l'ai fait maintenant, et de changer des choses et il fonctionne sans un vecteur.. mais pour l'avenir, parce que maintenant, ce n'est pas important, je veux vous demander juste pour expliquer comment vous allez créer un programme qui: ajouter une ligne dans le fichier, modifier, supprimer et la ligne doit être un objet de la classe de l'Étudiant et de cette classe à avoir des variables: id, nom, grade, points de type (où les points et le type sont pour la concurrence info)
OriginalL'auteur fre2ak