Avatar billede teepee Nybegynder
16. oktober 2002 - 16:09 Der er 15 kommentarer og
1 løsning

Fjerne første linie fra fil hvis den er blank (+ backup)

Jeg skal bruge en lille util (skal kunne compiles til winbaserede systemer) hvor man kalder:

[cstumpnavn] [filnavn]

hvorefter [filnavn] åbnes og hvis første linie er blank skal resultatet være at linien fjernes, men først efter at [filnavn].old er oprettet i den oprindelige version under samme sti som [filnavn].

Det må da være en let lille opgave for de rutinerede herinde hva?
Avatar billede arne_v Ekspert
16. oktober 2002 - 16:33 #1
Som et første udkast:

#include <stdio.h>

int main(int argc, char *argv[])
{
  FILE *fp,*fp2;
  int c;
  fp = fopen(argv[1],"r");
  c = fgetc(fp);
  if(c == '\n') {
      fp2 = fopen("temp.dat","w");
      while((c=fgetc(fp))!=EOF) fputc(c,fp2);
      fclose(fp);
      fclose(fp2);
      rename(argv[1],"backup.dat");
      rename("temp.dat", argv[1]);
  } else {
      fclose(fp);
  }
  exit(0);
}
Avatar billede arne_v Ekspert
16. oktober 2002 - 16:36 #2
Det kan forbedres på mange måder:
  - checke på om argumentet er angive og give en fejl-besked
    hvis ikke
  - check at temp.dat ikke eksisterer i forven eller generere et med
    garanti unikt navn
  - slette backup filen hvis den allerede eksisterer
  - navngive backuppen udfra den originale fil

Det sidste var faktisk i dit krav ! Skal jeg lige tilføje det ?
Avatar billede arne_v Ekspert
16. oktober 2002 - 16:40 #3
#include <stdio.h>

int main(int argc, char *argv[])
{
  FILE *fp,*fp2;
  int c;
  char bkupfnm[256];
  strcpy(bkupfnm,argv[1]);
  strcat(bkupfnm,".old");
  fp = fopen(argv[1],"r");
  c = fgetc(fp);
  if(c == '\n') {
      fp2 = fopen("temp.dat","w");
      while((c=fgetc(fp))!=EOF) fputc(c,fp2);
      fclose(fp);
      fclose(fp2);
      rename(argv[1],bkupfnm);
      rename("temp.dat", argv[1]);
  } else {
      fclose(fp);
  }
  exit(0);
}
Avatar billede teepee Nybegynder
16. oktober 2002 - 16:43 #4
Filerne genereres med løbenummer så sandsynligheden for at de findes i forvejen er temmelig liile. Men som du selv nævner skal .old gerne relatere til filnavnet. Det ser godt ud. Prøver lige....
Avatar billede arne_v Ekspert
16. oktober 2002 - 16:48 #5
Her er de 3 første pinde også ordnet:

#include <stdio.h>

int main(int argc, char *argv[])
{
  FILE *fp,*fp2;
  int c;
  char bkupfnm[256];
  char tempfnm[256] = "utilXXXXXX";
  if(argc < 1) {
      printf("Usage: util filename\n");
      exit(1);
  }
  strcpy(bkupfnm,argv[1]);
  strcat(bkupfnm,".old");
  mktemp(tempfnm);
  fp = fopen(argv[1],"r");
  c = fgetc(fp);
  if(c == '\n') {
      fp2 = fopen(tempfnm,"w");
      while((c=fgetc(fp))!=EOF) fputc(c,fp2);
      fclose(fp);
      fclose(fp2);
      remove(bkupfnm);
      rename(argv[1], bkupfnm);
      rename(tempfnm, argv[1]);
  } else {
      fclose(fp);
  }
  exit(0);
}
Avatar billede teepee Nybegynder
16. oktober 2002 - 16:49 #6
Min compiler brokker sig over strcat-linien. Siger det dig noget?
Avatar billede arne_v Ekspert
16. oktober 2002 - 16:51 #7
Prøv lige og tilføj:

#include <string.h>

min compilerer inkluderer viost den med stdio.h !
Avatar billede teepee Nybegynder
16. oktober 2002 - 16:52 #8
Nu er det blot mktemp den ikke kan finde :-)
Avatar billede arne_v Ekspert
16. oktober 2002 - 16:55 #9
#include <stdlib.h>
Avatar billede teepee Nybegynder
16. oktober 2002 - 16:56 #10
c:\dokume~1\c\trimifs.cpp:17: implicit declaration of function `int mktemp(...)'
Avatar billede teepee Nybegynder
16. oktober 2002 - 17:01 #11
Prøvede den simple udgave (uden mktemp) og den virker fint. Hvis du lige kan se hvorfor den udvidede ikke virker ville det være fint, men jeg takker meget for den simple
Avatar billede arne_v Ekspert
16. oktober 2002 - 17:08 #12
Det lyder som din C/C++ compiler (MSVC++ formoder jeg) ikke
kan lide mktemp.

Jeg bruger MinGW (Minimalist Gnu for Windows).

Hvis du ikke er bekymret for flere der køre util'en i
samme directory samtidigt og lignende kan du bare fjerne
kaldet af mktemp (og måske rette tempfnm værdien til).
Avatar billede arne_v Ekspert
16. oktober 2002 - 17:11 #13
Jeg vil lige prøve at søge lidt efter mktemp for MSVC++.

Stay tuned.
Avatar billede arne_v Ekspert
16. oktober 2002 - 19:02 #14
Prøv med:

#include <io.h>

og erstat mktemp med _mktemp.
Avatar billede jpk Nybegynder
17. oktober 2002 - 08:44 #15
arne_v >> Der er faktisk en funktion der hedder CopyFile...

BOOL CopyFile(
  LPCTSTR lpExistingFileName, // name of an existing file
  LPCTSTR lpNewFileName,      // name of new file
  BOOL bFailIfExists          // operation if file exists
);
Avatar billede teepee Nybegynder
17. oktober 2002 - 09:26 #16
BTW: Jeg lavede din
  if(argc < 1) {..printf..}
om til
  if(argc > 1) {..det spændende hér..} else {..printf..}
for den blev ved med at ignorere printf'en. Da jeg omskrev fungerede det fint.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester