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