Avatar billede fedtoere Praktikant
27. februar 2008 - 15:40 Der er 11 kommentarer og
1 løsning

string i C, håndtering af bla \0 mm

Mit ønske er at åbne et par filer fra et C program.

Til det ønsker jeg at benytte en fil som er navngivet ud fra filen som jeg åbner (navngives ud fra argv[1]).
En anden fil skal blot være et hardkodet navn i princippet "fil2.txt"
Men mit program fejler når jeg ønsker at åbne med det hardkodet navn.
Jeg benytter denne kommando til at åbne filen:

  if (samlet_output_file_ptr = fopen( output_name, "w" ))

Jeg har på fornemmelsen at min fejl er hvordan jeg behandler min streng på. Jeg har med succes åbnet flere filer ud fra navnet på min input fil, men jeg ønsker at kunne navngive den ene output fil med et fast navn (f.eks fil2.txt)

Håber du kan hjælpe mig, nu har det drillet mig længe nok...

PS Dette spørgsmål minder lidt om et tidligere jeg ikke har fået svar på.
Avatar billede bitmatic Nybegynder
27. februar 2008 - 19:03 #1
hvordan er output_name defineret ?
Avatar billede mxs Nybegynder
27. februar 2008 - 20:24 #2
Har jeg opfattet det rigtigt. Du har et program skrevet i C. Lad os kalde den "program". Du laver et kald til programmet ala "./program fil2.txt". I "program" har du så din sætning "if (samlet_output_file_ptr = fopen( output_name, "w" ))", hvor output_name er defineret på en eller anden måde?
Kan vi få lidt kode?
Avatar billede fedtoere Praktikant
28. februar 2008 - 10:22 #3
Jeg har lavet et mere simpelt eksempel både for at kunne vise koden her på eksperten men også for at give mig selv et større overblik over hvad der går galt.
Det der går galt er at jeg kun får åbnet mine filer aa.txt og aa__out.txt men min fil der har hardkodet navn samlet.txt bliver ikke åbnet/skabt.
Denne kode er vist herunder.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

#define MAX_LINE_LENGTH 400


int main(int argc, char *argv[])
{
  FILE *in, *out, *output_file_ptr;
  char *file_name;
  char out_name[MAX_LINE_LENGTH];
  bool errorstatus;

  errorstatus = false;

  if (argc != 2)
      {
      printf("\nError wrong number of arguments\n");
      getch();
      exit(-1);
      }

  file_name = argv[1];
  strcpy (out_name, argv[1]);
  *strrchr(out_name, '.') = 0;
  strcat(out_name, "__out2.txt");


  if ((in = fopen(file_name, "rt")) == NULL)
      {
      printf( "\n**** ERROR - can't open input file ****" );
      errorstatus = true;
      return 1;
      }

  if ((out = fopen(out_name, "wt")) == NULL)
      {
      printf( "\n**** ERROR - can't write to output file ****" );
      errorstatus = true;
      return 1;
      }

  while (!feof(in))
      fputc(fgetc(in), out);

  if (output_file_ptr = fopen( "samlet.txt", "a" ))
    {
    fprintf( output_file_ptr, "Dette skrives til filen samlet.txt som append");
    }
  else
    {
    printf( "\n**** ERROR - can't write to samlet.txt file ****" );
    errorstatus = true;
    }

  fclose(output_file_ptr);
  fclose(in);
  fclose(out);


  if (errorstatus == true)
      {
      getch();
      }

  return 0;
}
Avatar billede fedtoere Praktikant
28. februar 2008 - 10:26 #4
Jeg har lige konstateret at koden virker når jeg kører programmet fra en DOS-promt.
Så får jeg både min aa__.txt og min samlet.txt fil lavet.

Hvis jeg derimod kører programmet fra windows ved at trække og slippe min input fil (aa.txt) oven i ovenstående program exe fil, så får jeg ikke genereret min samlet.txt fil.

Hvad er grunden til dette ?
Avatar billede arne_v Ekspert
28. februar 2008 - 15:18 #5
Hvor har du laest at en fil trukket ind paa en EXE ender op i argv ?
Avatar billede fedtoere Praktikant
28. februar 2008 - 15:33 #6
Jeg har muligvis ikke læst det, men mener da at huske at jeg har lavet noget tilsvarende tidligere.
Hvis jeg vælger at bruge argv[1] har jeg da med held kunne hente filnavn ud på min input fil (mener jeg da). Men du (Arne) gør mig helt sikkert usikker på dette...

Arne, er det håbløst det jeg forsøger ?
Avatar billede arne_v Ekspert
28. februar 2008 - 15:39 #7
Der er ingen tvivl om at man skan skrive et program hvor du kan faa filnavnet
paa den fild er droppes ind paa EXE.

Jeg er bare ikke sikker paa at argv duer til det formaal.

Maaske jeg skulle google lidt ...
Avatar billede fedtoere Praktikant
28. februar 2008 - 15:52 #8
Jeg har med succes benyttet følgende, det virker:

      strcpy (xx2_name, argv[1]);             
      *strrchr(xx2_name, '.') = 0;             
      strcat(xx2_name, "__xx2.txt");           

Der benytter jeg oprindelige filnavn og tilføjer så endelsen __xx2.txt.
Avatar billede fedtoere Praktikant
28. februar 2008 - 15:59 #9
Sorry, mine filnavne er ikke de bedste i dette tilfælde.
Nedenfor har jeg tilføjet lidt mere af min kode der har med dette at gøre.

      FILE *output_file_ptr; 
      char xx2_name[MAX_LINE_LENGTH];
      ...
      file_name = argv[1];
      strcpy (xx2_name, argv[1]);   
      *strrchr(xx2_name, '.') = 0; 
      strcat(xx2_name, "__xx2.txt"); 
      ...
      if (output_file_ptr = fopen( xx2_name, "w" ))
        {skriv i filen}
      fclose(output_file_ptr);
Avatar billede fedtoere Praktikant
28. februar 2008 - 16:09 #10
Det der så går galt er når jeg hardkoder en anden fil jeg fil åbne, det går galt.
Som eks øverst med "samlet.txt" filen.

Det forstår jeg simpelthen ikke...
Avatar billede fedtoere Praktikant
29. februar 2008 - 14:49 #11
Arne, fandt du noget brugbart ?
Avatar billede fedtoere Praktikant
19. juni 2008 - 12:55 #12
Lukker spørgsmålet, løsning er ikke fundet.
Måske kan det ikke løses måske kan det....?

Pt har jeg lavet en work-around som jeg kan leve med, måske tager jeg spørgsmålet op igen på et senere tidspunkt.
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