J'implémente une base de données de fichiers très simple. J'ai 2 opérations de base:La lecture C++ à partir d'un fichier bloque toute autre écriture. Pourquoi?
void Insert(const std::string & i_record)
{
//create or append to the file
m_fileStream.open(m_fileName.c_str(), std::ios::out | std::ios::app);
if (m_fileStream.is_open())
{
m_fileStream << i_record << "\n";
}
m_fileStream.flush();
m_fileStream.close();
}
/*
* Returns a list with all the items in the file.
*/
std::vector<std::string> SelectAll()
{
std::vector<std::string> results;
m_fileStream.open(m_fileName.c_str(), std::ios::in);
std::string line;
if (m_fileStream.is_open())
{
while (!m_fileStream.eof())
{
getline (m_fileStream, line);
results.push_back(line);
}
}
m_fileStream.close();
return results;
}
la classe a m_fileStream et m_fileName en tant que membres privés.
OK - voici le problème:
Si je fais quelque chose comme:
db->Insert("a");
db->SelectAll();
db->Insert("b");
Le résultat final est que le fichier contiendra que "a"; POURQUOI?
REMARQUE: il semble que getline() définira le bit de défaillance. mais pourquoi?
Non, cela ne fonctionne pas. Le flux est toujours dans un état d'échec (le bit d'échec est défini). –
Le code que vous nous avez montré fonctionne (avec cette correction). Donc c'est quelque chose que vous ne nous montrez pas qui échoue. getline() définira finalement l'indicateur eof() et ainsi fail() ne sera pas vrai. Mais fermer le fichier le rendra muet. –
Martin: De quoi parlez-vous? Pouvez-vous s'il vous plait reformuler? À l'heure actuelle, cela n'a guère de sens. –