Avatar billede x4all_dk Nybegynder
14. december 2005 - 11:52 Der er 29 kommentarer og
1 løsning

C, commandline input

Jeg skal bruge commandline input til at gemme i fil!
Programmet skal tage et input, og gemme det sidst i en binærfil.

Eksempel:

GemData "Dette skal gemmes"

.... mit problem er at hvis jeg bruger argv[2] og gemmer til filen
så står det der ikke "rigtigt"?? (ihvert fald ikke med ASCII nr.)

Gemmer jeg istedet med en "hardcoced": char *tekst = "Dette skal gemmes"; så gemmes det med ascii i filen korrekt!

Så hvem kan lave dette ?
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 13:46 #1
du bliver nød til at vise noget mere kode ellers kunne man forestille sig følgende

#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
  fstream out;
  out.open("C:\\Test.txt", ios.out);
  fstream * p_out;
  p_out = &out;
  *p_out << "Det er en test" <<endl;
    return 0;
}
Avatar billede x4all_dk Nybegynder
14. december 2005 - 14:25 #2
Følgende har jeg pillet ud (håber at alle #includes er med :) )


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

void writetest(char *name)
{
  FILE *fp;
  fp = fopen("binary.bin","r+");
  fseek(fp,256,SEEK_SET); // write at some location in file...
  fwrite(&name,1,10,fp); // write
  fclose(fp);   
}

int main(int argc, char *argv[])
{
// commandline-input: argv[2] = "Hej 10char";

  writetest(*argv[2]);
}


Efter dette skal der så gerne i filen på være de 10 chars (i ansii) på
det ønskede sted.... men.. der står lidt andre værdier når jeg kigger i filen!
Avatar billede arne_v Ekspert
14. december 2005 - 15:34 #3
hvad står der helt præcsist i filen ?

skal det ikke være

writetest(argv[2]);

? (uden stjerne)
Avatar billede x4all_dk Nybegynder
14. december 2005 - 16:05 #4
arne_v:

Skriver jeg:
writetest(argv[2]);

Får følgende fejl i (bruger GCC):
warning: passing arg 2 of `writetest' makes integer from pointer without a cast
Avatar billede x4all_dk Nybegynder
14. december 2005 - 16:15 #5
Hvis jeg hardcoder teksten står der følgende i filen:
"Hej 10char"

Forsøger jeg at anvende argv[2] står der dette i filen:
"Öí¿¿      "
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 16:19 #6
Jeg giver op, jeg kan ikke engang få den til at skrive noget i filen!

Det kan selvfølgelig være at ikke includes er med :)

Jeg får debug assertion i fseek(...)
Avatar billede arne_v Ekspert
14. december 2005 - 16:20 #7
øh

den fejl får jeg med stjernen men ikke uden

på den kode som du har postet
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 16:23 #8
mener du testpilot eller x4all_dk


arne_v
Avatar billede x4all_dk Nybegynder
14. december 2005 - 16:27 #9
Mystisk det virker skam fint for mig (hvis jeg lige retter main til):

int main(int argc, char *argv[])
{
// commandline-input: argv[2] = "Hej 10char";
  writetest(argv[2]);
  return 0;
}

Og har en fil (binary.bin) med en vis størrelse, da fseek jo læser lidt frem i filen..
Avatar billede x4all_dk Nybegynder
14. december 2005 - 16:28 #10
arne_v: Du har ret! * skal ikke med!
Avatar billede arne_v Ekspert
14. december 2005 - 16:30 #11
14:25:41
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 16:33 #12
okay!


Jeg har også fået den til at kører!

Når du gemmer binært, bliver det så ikke gemt som ascii værdier ????
Hvad forventer du at der står i filen, når du sender "Hej 10char" i den
Avatar billede x4all_dk Nybegynder
14. december 2005 - 16:37 #13
Jeg forventer at det gemmes som ascii værdier... men det gør det ikke!

Hvis jeg hardcoded en 'char navn[10] = "Hej 10char";' så virker det fint,
men ved brug af argv[2] så står der andre hex-værdier i filen end hvis jeg bruger den anden metode
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 16:43 #14
jeg får samme værdier ligegyldigt hvilken metode jeg bruger

med pointer
37ë‘|


med char[11]
37ë‘|
Avatar billede x4all_dk Nybegynder
14. december 2005 - 17:09 #15
Der skulle gerne stå :"Hej 10char" uanset hvilken måde der vælges,
og det er det som jeg ikke kan finde ud af!
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 17:24 #16
det skal der vel ikke stå i den binære fil! det er vel mere når man trækker indholdet ud igen
Avatar billede x4all_dk Nybegynder
14. december 2005 - 17:30 #17
jo det skal stå filen. (så hvis jeg åbner den i en editor og se på indholdet, så kan
jeg se "Hej 10char" står i den).
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 17:31 #18
hvad er det for en editor du bruger
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 17:37 #19
jeps, nu kan jeg se hvad der er galt!

void writetest(char *name)
{
    FILE *fp;
    char navn[11] = "Hej 10char";
    fp = fopen("binary.bin","r+");
    fseek(fp,256,SEEK_SET); // write at some location in file...
    fwrite(&navn,1,10,fp); // write   
    fclose(fp);   
   
    fp = fopen("binary2.bin", "r+");
    fseek(fp, 256, SEEK_SET);
    fwrite(_strdup(name), 1, 10, fp);
    fclose(fp);   
}
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 17:37 #20
har benyttet _strdup()    laver en duplicat at det du har i pointeren og så gemmer den det rigtige ned
Avatar billede x4all_dk Nybegynder
14. december 2005 - 17:52 #21
Hvilke includes har du med ? #include <string.h>  og ?

Jeg får nemlig en del fejl når jeg compiler!
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 18:00 #22
jeg har bare oprettet en standard konsol program i vs 2003!

Jeg finder lige ud af det med, med includes

Men string.h er et godt forslag
Måske også <iostream>

msdn siger således
        #include <string.h>
        #include <stdio.h>

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt__strdup.2c_._wcsdup.2c_._mbsdup.asp


Skriver det lidt senrere
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 18:45 #23
jeg benytter

#include <iostream>
#include <tchar.h>

#include <stdio.h>
#include <stdlib.h>
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 18:46 #24
men iostream, så virker det

De andre er ikke nødvendige
Avatar billede testpilot_dk Nybegynder
14. december 2005 - 20:01 #25
har du fået det til at virke ??
Avatar billede x4all_dk Nybegynder
15. december 2005 - 10:14 #26
Nu ved jeg hvad som driller mig, det er fordi du har anvendt et
windows-only ting.

_strdup     <string.h>     Win 98, Win Me, Win NT, Win 2000, Win XP


Hmm.. kan man ikke lave den funktion i C ?  (jeg compiler den på FreeBSD/Linux)
Avatar billede testpilot_dk Nybegynder
15. december 2005 - 10:23 #27
tja det ved jeg så ikke!

Men det funktionen gør er jo bare at kopiere pointerens indhold!

har du mulighed for at benytte <string.h> eller noget lignedne

jeg er ikke vant til at programmere i Linux!
Avatar billede testpilot_dk Nybegynder
15. december 2005 - 10:31 #28
char * tmp = name;
    fwrite(tmp, 1, 10, fp);

DEtte vil jeg mene virker
Avatar billede x4all_dk Nybegynder
15. december 2005 - 11:26 #29
YeS!

Mange tak testpilot_dk
Avatar billede testpilot_dk Nybegynder
15. december 2005 - 11:30 #30
Det var så lidt :)
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