Dra- och släppa på program i Windows
Postat: 15 maj 2010, 16:57
Jag försöker göra ett program som städar bort radnummer från programexemplen i min programmeringsbok. Någon tomte på Gleerups tyckte att det var en bra idé att inkludera radnumren så att det inte ska gå att kopiera och klistra in koden i exemplen rakt av. Det ser ut så här ungefär:
och så vidare. Lägg märke till bristen av indentering på rad 6. Det programmet jag skapat för att plocka bort radnumren och indentera automagiskt ser ut så här:
Det fungerar utmärkt om man kör det från terminalen ("kommandotolken") men jag vill att man ska kunna dra sin kodfil och släppa den på programmet grafiskt. Men när jag gör det händer ingenting och ingenting skrivs i dbgfil.txt (alla argument ska annars skrivas till den filen). Är detta ens möjligt och hur svårt är det i så fall? Min programmeringslärare skulle "kolla upp det" men hon är ganska lat så det kommer nog inte att hända
Kod: Markera allt
1. // beskrivning
2. #include <iostream>
3. using namespace std;
4. int main()
5. {
6. gör_nåt();
Kod: Markera allt
/*
* Cleaner, alpha 1
* Tar bort radnummer från exemplen i Gleerups-materialet och indenterar automatiskt.
* Programmet skriver till samma fil som det läser från (egentligen skapar det en
* ny fil som sedan flyttas till den gamla).
* Fungerar genom flera kataloger, olika enheter är inte testat än.
*
* Användning: cleaner.exe [alternativ] fil.cpp
* Finns inga alternativ än så skriv inga är du snäll!
*
* Buggar:
* Ingen felhantering whatsoever!
* Kollar inte om filen redan är färdig
*
* Indentering för } hamnar ett steg för långt. Exempel:
* > int main()
* > {
* > return 0;
* > }
*
* (c) Anton Eliasson, 26 april 2010
* Licens: Creative Commons Attribution-Share Alike 3.0
*
*/
//---------------------------------------------------------------------------
// Includes
#include <iostream>
#include <fstream>
#include <string>
#include <cstdio> // behövs för rename() och remove()
using namespace std;
//---------------------------------------------------------------------------
// Defines
//---------------------------------------------------------------------------
// Declarations
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
ofstream dbgfil;
dbgfil.open("dbg.txt");
dbgfil << "argc=" << argc << endl << "argv:\n";
for (int i = 0; i < argc; i++) {
dbgfil << argv[i] << endl;
}
dbgfil.close();
if (argc > 1) { // det finns minst ett argument
ifstream infil; // filen vi vill ändra i
ofstream utfil; // en ny, temporär fil att skriva i
string rad; // en läst rad från filen
int indentering = 0, nyindentering, temp; // antal steg att indentera
infil.open(argv[1]); // förutsätter att filnamnet ligger i argument 1 (första efter programmets namn)
if (!infil) {
cout << "Kunde inte öppna filen " << argv[1] << " för läsning!\n";
exit(1);
}
utfil.open("tempfil.tmp");
if (!utfil) {
cout << "Kunde inte öppna filen \"tempfil.tmp\" för skrivning!\n";
exit(1);
}
while (getline(infil, rad)) { // så länge en ny rad kan läsas från filen
int pek = 0;
while (rad.at(pek) >= '0' && rad.at(pek) <= '9') { // kollar hur många tecken i början på strängen som är siffror.
pek++;
}
utfil << rad.substr(pek+2, rad.length()) << endl; // hoppar över radnummer, punkt och mellanslag och kopierar resten av strängen
//nyindentering = indentering;
// kolla sedan indenteringen för nästa rad:
for (unsigned int i = 0; i < rad.length(); i++) {
if (rad.at(i) == '{') {
indentering++; // öka
}
else if (rad.at(i) == '}') {
indentering--; // minska
}
}
for (int i = 0; i < indentering; i++) { // skriv indentering för nästa rad
utfil << " ";
}
}
infil.close();
utfil.close();
/*remove(argv[1]); // ta bort infil
if (rename("tempfil.tmp", argv[1])) { // flyttar temporär fil till infil
cout << "Fel vid flyttning av tempfil.tmp\n";
}*/
// mesvarianten, gör backup först:
if (rename(argv[1], "bak.tmp")) { // gör en backup av infil
cout << "Fel vid flyttning av " << argv[1];
}
if (rename("tempfil.tmp", argv[1])) { // flyttar temporär fil till infil
cout << "Fel vid flyttning av tempfil.tmp\n";
}
}
else {
cout << "Användning:\n"
<< "cleaner.exe fil.cpp\n";
}
return 0;
}