Hej, min far kom igår og hjalp mig med at få rettet lidt op på programmet og vi fik /* og */ til at virke desværre virker // ikke... Her er koden:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <fstream>
using namespace std;
//Dette er et program der skal lave indrykninger
//korekte, eller hvad man nu siger ;-)
//Vi laver programmet i tre dele:
//1. Lav sikkerhedskopi - færdig
//2. Fjern mellemrum - ikke lavet
//3. Lav mellemrum - mangler skriv fil
int main(int argc, char **argv)
{
if(argc==1)
{
//Tjek om filnavn er sendt med
cout << "Usage: fixtab filename" << endl;
}
else
{
bool mOption = false;
bool iOption = false;
bool options = false;
for (int j=2; j<argc; ++j) //Løb de medsendte data igennem
{
string temp = argv[j]; //Tag et ord fra de medsendte data
if (temp[0] == '-') //Er der - i?
{
if(argc==3) options = true; //Hvis det er det 3. ord skal vi sætte options til true så vi ved at der ikke er sendt data om antal mellemrum
if(temp[1]=='m')//Hvis m er det 2. bogstav skal vi sætte mOption t true.
{
mOption = true;
}else if(temp[1]=='i')//Hvis m er det 2. bogstav skal vi sætte iOption t true.
{
iOption = true;
}
}
}
cout << "\\n"; //Vi starter med et linjeskift - bare for at det skal se pænt ud
//Her kommer selve programmet
//Lav variable
string linje; //Skal bruges til at holde linjen
int antalIndRyk = 0; //Skal holde styr på hvormange indrykninger der skal laves
string temp; //Skal kort gemme et tegn
int antalMellemrum = 4; //Hvormange mellemrum skal der være?
int nummer; //Skal bruges til at holde nummeret inde { og } er
int nummer2; //Skal bruges til at holde nummeret inde { og } er
unsigned int kommentar=255; //Skal bruges til at fortælle om der er kommentarer i linjen
int startkom; //Skal bruges til at lede efter /*
int slutkom; //Skal bruges til at lede efter */
bool kommentaraaben = false; //Er der en /* eller */
////////////////////// NUMMER 1 //////////////////////
ifstream input_fil(argv[1]); //Åbn filen
if(!input_fil.is_open())
{
cout << "Fejl! Filen kunne ikke aabnes!";
exit(0);
}
ofstream output_fil("sikkerhedskopi.txt"); //Lav fil til kopi
//Kør filen igennem for at lave sikkerhedskopi
while(!input_fil.eof())
{
getline(input_fil ,linje); //Hent linje
output_fil << linje << endl; //Skriv linje til kopifil
}
output_fil.close(); //Luk kopi-filen
input_fil.close(); //Luk filen
////////////////////// NUMMER 2 //////////////////////
ifstream input_fil2(argv[1]); //Åbn filen
ofstream output_fil2("indrykketfil.txt"); //Lav fil til den færdige kode, dette er kun midlertidigt og filen vil blive slette senere
while(!input_fil2.eof())
{
getline(input_fil2 ,linje); //Hent linje
while( (linje.length() > 0) && ((linje[0]==' ') || (linje[0]==0) || (linje[0]=='\\t'))) //Så længe der er ' ', 0, \\t i linje så...
{
linje.erase(0,1); //...slet første bogstav
}
/*string::size_type notwhite = linje.find_first_not_of(" \\t\\r\\n");
if (notwhite == string::npos)
{
linje = "";
}
else if (notwhite > 0)
{
linje.erase(0,notwhite);
}*/
output_fil2 << linje; //Skriv linje til færdig-fil
if (!input_fil2.eof()) //Hvis ikke filen er tom
{
output_fil2 << endl; //Så slut linjen. Det gør vi fordi vi ikke ønsker at lave tomme linjer i enden af hver fil
}
}
output_fil2.close(); //Luk færdig-fil
input_fil2.close(); //Luk læse-fil
////////////////////// NUMMER 3 //////////////////////
ifstream input_fil3("indrykketfil.txt"); //Åbn filen vi lavede før
ofstream output_fil3(argv[1]); //Lav fil til den færdige kode, dette er kun midlertidigt
//Først vil vi lave så mange mellemrum som brugeren ønsker:
if ((argc > 2) && (!options))
{
antalMellemrum = atoi(argv[2]); //Laver char*'eren argv[2] om til int
}
string mellemrum(antalMellemrum,' ');
//Kør filen igennem for at lede efter { og }
while(!input_fil3.eof())
{
getline(input_fil3 ,linje); //Hent linje
nummer = linje.find('{',0); //find { i linjen
nummer2 = linje.find('}',0); //find } i linjen
if(iOption) startkom = linje.find("/*",0); //find /* i linjen
if(iOption) slutkom = linje.find("*/",0); //find */ i linjer
if(iOption) kommentar = linje.find("//",0); //Find kommentarer i linjen
if((iOption) && (startkom != string::npos)) kommentaraaben = true;
if((kommentar != string::npos) && (nummer != string::npos)) cout << nummer2 << " " << kommentar << " " << linje << endl;
if(nummer2 != string::npos) //Er der } i linjen?
{
if((!iOption) || (!kommentaraaben) || ((kommentar != string::npos) && (nummer2 < kommentar))) antalIndRyk=antalIndRyk-1; //Tæl antalIndRyk en ned
}
if((!mOption) || (linje.length()>0))
{
if(antalIndRyk < 1)
{
//Der er fejl: antalIndRyk er 0 eller under
//derfor gør vi ingen ting
}
else
{
int i=0; //Lav en variabel vi kan bruge i while-lykken
while(i<antalIndRyk)
{
linje = mellemrum + linje;
i++; //Tæl i op for at komme videre
}
}
}
output_fil3 << linje; //Skriv linje i filen
if (!input_fil3.eof()) //Hvis vi er i slutningen af filen...
{
output_fil3 << endl; //Så slut linjen. Det gør vi fordi vi ikke ønsker at lave tomme linjer i enden af hver fil
}
if((iOption) && (slutkom != string::npos)) kommentaraaben = false;
if(nummer != string::npos)//Er der { i linjen?
{
if((!iOption) || (!kommentaraaben)/* || ((kommentar != string::npos) && (nummer < kommentar))*/) antalIndRyk=antalIndRyk+1; //Tæl antalIndRyk en op
}
}
input_fil3.close(); //Luk filen vi læser fra
output_fil3.close(); //Luk filen vi skriver i
if( remove( "indrykketfil.txt" ) == -1 ) cout << "Fejl! Sæet manuelt filen indrykketfil.txt" ;
}
return 0;
}
bemærk at den store ændring er i de to if sætninger...
Bemærk også at koden virker selvom man fjerner kommentarene i:
if((!iOption) || (!kommentaraaben)/* || ((kommentar != string::npos) && (nummer < kommentar))*/)
og/eller sætter kommentarer i denne:
if((!iOption) || (!kommentaraaben) || ((kommentar != string::npos) && (nummer2 < kommentar)))
Nogen der kan se hvad jeg gør galt nu?