Jesper Staun Hansen wrote:
> Jakob Bøhm wrote:
>> Jesper Staun Hansen wrote:
>>> Jakob Bøhm wrote:
>>>> Jesper Staun Hansen wrote:
>>>>> Vil gerne benytte pointers til at sætte filename og mode.
>>>>> Men jeg ikke dette er muligt, da den giver fejl som følgende:
>>>>> writedb.c: In function ‘writedb’:
>>>>> writedb.c:14: warning: passing argument 1 of ‘fopen’ from
>>>>> incompatible pointer type
>>>>> writedb.c:14: warning: passing argument 2 of ‘fopen’ from
>>>>> incompatible pointer type
>>>>>
>>>>>
>>>>> --- kode ---
>>>>>
>>>>> char questfile[120];
>>>>> char questmode[4];
>>>>>
>>>>> int function(void) {
>>>>>
>>>>> char *filename;
>>>>> filename = &questfile;
>>>>> char *mode;
>>>>> mode = &questmode;
>>>>>
>>>>> fp = fopen(*filename, *mode)
>>>>>
>>>>> }
>>>>
>>>> Du bruger for mange * og & operatorer.
>>>>
>>>> I C er navnet på et array og en strengconstant begge equivalente til
>>>> en peger til første element/tegn.
>>>>
>>>> Den bedste introduktion til C jeg har læst (og også den første) er
>>>> klassikeren over dem alle:
>>>>
>>>> Brian Kernigan & Dennis Ritchie "The C Programming Language", 2. udgave
>>>>
>>>> Det er en lille tynd bog, men den gennemgår hele sproget med
>>>> tydelige forklaringer og eksempler. Bagerst i bogen er der en meget
>>>> præcis (men dog uofficiel) definition af C sproget. De to
>>>> forfattere opfandt selv sproget C og skrev den første compiler. 1.
>>>> udgave af bogen (nu forældet) var faktisk selve definitionen af
>>>> sproget C før 1989.
>>>>
>>>
>>> Vil bestemt lede efter den
>>>
>>>> -- kode --
>>>>
>>>> char questfile[120];
>>>> char questmode[4];
>>>>
>>>> int function(void) {
>>>>
>>>> char *filename;
>>>> filename = questfile;
>>>> char *mode;
>>>> mode = questmode;
>>>>
>>>> fp = fopen(filename, mode);
>>>>
>>>> }
>>>>
>>>>
>>>
>>> Ah, mange tak for det. Rodder rundt i de pointers nogle gange og er
>>> stadig ikke sikker på hvordan de bruges helt 100% hvorhenne endnu.
>>>
>>> I den bog jeg sidder med lige nu, så giver de eksempler med
>>> gets(variabel); men gcc-4.1 siger at denne farlig og bør ikke benyttes.
>>> Er der nogle der ligner den? (således jeg ikke skal bruge nogle
>>> linjer kode med på en while løkke der tjekker efter enter og fylder i
>>> en array)
>> fgets
>>
>
> hmmm... Der er noget jeg ikke har fået fat i vil jeg tro.
>
> Har fikset følgende:
>
>
> ==================================
> #include <stdio.h>
> char questfile[120];
> char questmode[4];
>
> int writedb() {
> FILE *fp;
> char *filename;
> filename = questfile;linjer
> char *mode;
> mode = questmode;
>
> if((fp = fopen(filename, mode)) == NULL) {
> printf("File error. File %c may not exist in %c mode\n",
> puts(questfile), puts(questmode));
perror(questfile); /* Skriver f.eks. whopper: File not found\n */
fprintf(stderr, "File error in %s mode\n", questmode);
/* bemærk at man bruger %s og strengen som argument for at udskrive en
streng, ikke et kald til puts inde i printf-kaldet */
> } else {
> printf("yay");
> }
> }
>
> #include <stdio.h>
> #include "writedb.c"
>
/* fgets tager linieskiftet sidst på linien med i sit resultat, hvis der
var plads i bufferen. Denne funktion fjerner det igen */
void choplf(char *pBuf, size_t bufcnt)
{
if (pBuf && bufcnt) {
char *pEnd = memchr(buf, 0, bufcnt);
if (!pEnd)
pEnd = buf + bufcnt - 1; /* 0-terminering manglede! */
while (pEnd > pBuf && (pEnd[-1] == '\n' || pEnd[-1] == '\r'))
--pEnd;
*pEnd = 0; /* klip halen af og sørg for at strengen er
nultermineret */
}
}
> int main(void) {
> long offset = 1;
> fgets(questfile, 120, stdin);
/* sizeof/sizeof-formlen finder ud af at der står 120 i erklæringen af
questfile, så undgår du at skulle huske at rette tallet 3 steder */
fgets(questfile, sizeof(questfile)/sizeof(questfile[0]), stdin);
choplf(questfile, sizeof(questfile)/sizeof(questfile[0]));
> fgets(questmode, 4, stdin);
fgets(questmode, sizeof(questmode)/sizeof(questmode[0]), stdin);
choplf(questmode, sizeof(questmode)/sizeof(questmode[0]));
> writedb();
> return 0;
> }
> ===================================
>
> Det giver følgende output:
> whopper
> r
> r
> whopper
> File error. File may not exist in mode
--
Jakob Bøhm, M.Sc.Eng. * jb@danware.dk * direct tel:+45-45-90-25-33
Danware Data A/S * Bregnerodvej 127 * DK-3460 Birkerod * DENMARK
http://www.netop.com * tel:+45-45-90-25-25 * fax tel:+45-45-90-25-26
Information in this mail is hasty, not binding and may not be right