Sida 1 av 1

Dra- och släppa på program i Windows

Postat: 15 maj 2010, 16:57
av m!rage
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:

Kod: Markera allt

1. // beskrivning
2. #include <iostream>
3. using namespace std;
4. int main()
5. {
6. gör_nåt();
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:

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;
}
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

Re: Dra- och släppa på program i Windows

Postat: 15 maj 2010, 17:24
av KiviE
Har aldrig gjort något sådant själv men med lite hjälp av google hittade jag http://newplanetsoftware.com/xdnd/

Lycka till!

Re: Dra- och släppa på program i Windows

Postat: 15 maj 2010, 21:18
av Dr Phil
Utanför ämnet:
KiviE skrev:Utanför ämnet: Har aldrig gjort något sådant själv men med lite hjälp av google hittade jag http://newplanetsoftware.com/xdnd/

Lycka till!
Utanför ämnet:
Använder Windows verkligen X?

Re: Dra- och släppa på program i Windows

Postat: 15 maj 2010, 22:49
av KiviE
Dr Phil skrev:Utanför ämnet:
KiviE skrev:Utanför ämnet: Har aldrig gjort något sådant själv men med lite hjälp av google hittade jag http://newplanetsoftware.com/xdnd/

Lycka till!
Utanför ämnet:
Använder Windows verkligen X?
Haha, så noga läste jag inte rubriken :)