Erreur d'ouverture de fichier c++

Résolu/Fermé
Signaler
-
 coucougael94 -
Bien le bonjour amis programmeurs!

Je requiers encore une fois votre aide. Le problème est simple : j'essaie d'ouvrir un fichier, mais j'ai une erreur lors de l'ouverture des deux fichiers. J'ouvre pourtant des tas d'autres fichiers dans une autre classe sans soucis, et là je sèche...

Voici mon code :

Dans le header :

QFile * file;

Dans le constructeur :

file = new QFile(":/resources/variables2.txt");

Dans le .cpp :

void TextEdit::keyPressEvent(QKeyEvent *e)
{

QFile file2(":/resources/variables2.txt");
if(!file2.exists())
{
cout<<"Erreur dans le chemin de fichier"<<endl;
}

if(!file2.open(QIODevice::WriteOnly|QIODevice::Append))
{
cout<<"Erreur lors de l'ouverture du fichier 2"<<endl;
}

if(!file->open(QIODevice::WriteOnly|QIODevice::Append))
{
cout<<"Erreur lors de l'ouverture du fichier!"<<endl;
}

QTextStream flux(file);
QString completionPrefix = textUnderCursor();

if((e->key()==Qt::Key_Space))
{
MainWindow *mw = dynamic_cast<MainWindow *>(this->parentWidget());
if(!mw->words.contains(completionPrefix))
{
cout<<completionPrefix.toStdString()<<endl;
flux<<completionPrefix;
flux.seek(0);
flux.flush();
}
cout<<"la touche espace à été préssée"<<endl;
}

if (c && c->popup()->isVisible()) {
// The following keys are forwarded by the completer to the widget
switch (e->key()) {
case Qt::Key_Enter:
case Qt::Key_Return:
case Qt::Key_Escape:
case Qt::Key_Tab:
case Qt::Key_Backtab:
e->ignore();
return; // let the completer do default behavior
default:
break;
}
}

bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_E); // CTRL+E
if (!c || !isShortcut) // dont process the shortcut when we have a completer
QTextEdit::keyPressEvent(e);
//! [7]

//! [8]
const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier);
if (!c || (ctrlOrShift && e->text().isEmpty()))
return;

static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word
bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift;

if (!isShortcut && (hasModifier || e->text().isEmpty()|| completionPrefix.length() < 3
|| eow.contains(e->text().right(1)))) {
c->popup()->hide();

return;
}

if (completionPrefix != c->completionPrefix()) {
c->setCompletionPrefix(completionPrefix);
c->popup()->setCurrentIndex(c->completionModel()->index(0, 0));
}
QRect cr = cursorRect();
cr.setWidth(c->popup()->sizeHintForColumn(0)
+ c->popup()->verticalScrollBar()->sizeHint().width());
c->complete(cr); // popup it up!

file->close();
file2.close();

}

6 réponses

Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 324
Salut.
quelques précisions supplémentaire : quelle version de QT, quel compilateur ?
Sous windows, le chemin absolue comporte normalement la lettre du lecteur. As tu essayé avec ?
Autre possibilité sur les vieux QT, il fallait utiliser le style windows de chemin, c'est à dire \ à la place de /
file = new QFile("C:\\resources\\variables2.txt");
Pour l'erreur sur ce fichier, comme tu l'ouvre en append, il devrais normalement te le créé, même si il ne le trouve pas. Si il ne le fait pas c'est vraiment que lui passe un mauvais chemin.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41989 internautes nous ont dit merci ce mois-ci

Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 324
file = new QFile(":/resources/variables2.txt");
C'est quoi ces ':' dans le chemin du fichier ?
Soit tu es sur Unix et ils ne servent à rien, soit tu es sous win et il manque la lettre du lecteur.
Il les faut, je sais pas vraiment pourquoi, mais dans toutes mes autres ouvertures ils y sont...
> Kaos
N'insiste pas ! Char Snipeur a toujours raison... et c'est encore le cas.
D'autre part, au lieu d'utiliser les balises 'italique', utilise plutôt les balises 'code' (on trouve les balises: 'gras', 'italique', 'souligné', 'code', 'lien'), car, lorsque tu tombes sur une personne qui, comme moi, refuse de lire un code illisible, tu es sûr de ne pas avoir de réponse; mais si tu préfères l'italique, je respecte ton choix ;-)
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 324 > Kaos
je sais pas vraiment pourquoi
Une partie du problème doit venir de là. Quand on ne sait pas ce qu'on fait, ça peut causer des problèmes à un moment ou un autre.
Montre moi un exemple de code avec une ouverture contenant ces ':' .
Et comme Loupious le dit, utilise les balises de code. Je me suis arrêté à la première ligne de ce que tu as mis.
Les :/ sont pour utilisé les ressources. les ressources s'utilise avec un fichier.qrc.
Les ressources sont des fichiers ce trouvant a l’intérieure des logiciels.
Sont code est tout a fait valide, a condition que ces ressources possèdent le préfixe "ressources" ainsi que le fichier "variable2.txt".
Autant pour moi, j'ai pas vu de balise "code". Mais si j'enlève les ":", j'ai l'erreur du mauvais chemin...

Je vous met un bon résumé de mon code, pour m'excuser :)


QFile * file;

file = new QFile("/resources/variables2.txt");

void TextEdit::keyPressEvent(QKeyEvent *e)
{

    QFile file2(":/resources/variables2.txt");
    if(!file2.exists())
    {
        cout<<"Erreur dans le chemin de fichier"<<endl;
    }

    if(!file2.open(QIODevice::WriteOnly|QIODevice::Append))
    {
        cout<<"Erreur lors de l'ouverture du fichier 2"<<endl;
    }

    if(!file->open(QIODevice::WriteOnly|QIODevice::Append))
    {
        cout<<"Erreur lors de l'ouverture du fichier!"<<endl;
    }



Vu que j'ai les messages d'erreurs qui surviennent, le reste de la fonction n'est pour rien dans le problème...
Tu ne dis toujours pas si tu es sous Windows ou sous Linux.
Et l'erreur c'est pour 'file' ou 'file2'.
Donnes aussi les messages d'erreur tels qu'ils sont donnés.
Je suis sous windows. Les messages d'erreur sont ceux que j'affiche dans les "cout", et ce pour les deux fichiers. Les voila :

Erreur dans le chemin de fichier
Erreur lors de l'ouverture du fichier 2
Erreur lors de l'ouverture du fichier!
QFile::seek: IODevice is not open

La première n'y est plus si je rajoute les ":" devant le chemin. C'est a devenir fou, si vous voulez je vous montre mon code que j'utilise pour manipuler d'autres fichiers dans une autre classe, et qui marche très bien...
Aux deux tiers, rien de surprenant:
1) Erreur dans le chemin de fichier
normal qu'iol ne trouve pas: ':/resources/variables2.txt'
2) Erreur lors de l'ouverture du fichier 2
Puis que le fichier ':/resources/variables2.txt' ne peut exister, il est normal qu'il ne puisse l'ouvrir.
3) Erreur lors de l'ouverture du fichier!
S'il dit 'erreur' c'est qu'il y a une raison; voir si le fichier existe déjà, si on a le droit sur ce fichier; il y a une raison, les bugs sont rares; il faut chercher.
Bon, beh apparement il fallait bien mettre le chemin complet avec les "\\". L'ouverture et l'écriture marchent bien, mais je reste quand même très curieux de savoir ce qui peut faire marcher une ouverture sans chemin complet, et pas une autre...

Dans tous les cas merci pour vos conseils judicieux, et désolé de ne vous avoir pas facilité la tâche!
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 324
l'ouverture par un chemin non complet dépendra du répertoire courant et des droits associées.