/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
kopi af filer ?
Fra : Jesper Kampfeldt


Dato : 05-03-01 00:56

Hejsa jeg har et lille problem.

Jeg bruger cygwin's gcc som compiler på windows 98.

jeg har lavet dette prog. til at kopier filer:

#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

#define BUFSIZE 512
#define PERM 0644

main(int argc,char *argv[]){

void buffer[BUFSIZE];
int infile,outfile;
ssize_t nread;


// check for two and only two parameters
if(argc < 3 || argc > 3){
printf("please specify two and only two filenames");
exit(1);
}

// open the file to copy
if(( infile = open(argv[1],O_RDONLY))==-1)
exit(-1);

// open the new file
if((outfile = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,PERM)) == -1){
close(infile);
exit(-1);
}

// loop that does the copying
while((nread = read(infile,buffer,BUFSIZE)) > 0){

if( write(outfile,buffer,nread)){
close(infile);
close(outfile);
exit(-1);
}
}

// the files are closed
close(infile);
close(outfile);

// last check
if(nread == -1)
exit(-1);
else
exit(0);
}

men programmet kopier kun noget af filen.

Jesper

ps. programmet er også vedhæftet.





 
 
Igor V. Rafienko (05-03-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 05-03-01 10:29

* Jesper Kampfeldt

[snip]

> jeg har lavet dette prog. til at kopier filer:


Jeg _nekter_ å tro på at dette fungerer. It simply can't (gcc og cc5.0
er enige med meg)


> #include <stdlib.h>
> #include <fcntl.h>
> #include <unistd.h>


Du trenger ikke *nix-spesifikke ting for slike oppgaver.


> #define BUFSIZE 512


512UL


> #define PERM 0644


0644U


> main(int argc,char *argv[]){


int main


> void buffer[BUFSIZE];


Siden når ble det lov å ha arrays av void:

$ gcc -ansi -pedantic test.c
test.c: In function `main':
test.c:10: declaration of `buffer' as array of voids
$


> int infile,outfile;
> ssize_t nread;
>
>
> // check for two and only two parameters
> if(argc < 3 || argc > 3){
> printf("please specify two and only two filenames");


Tradisjonelt sett går feilmeldingene til stderr, ikke stdout.


> exit(1);
> }
>
> // open the file to copy
> if(( infile = open(argv[1],O_RDONLY))==-1)
> exit(-1);


Hvorfor bruker du et (tradisjonelt) *nix-spesifikt kall, når fopen
gjør nytten?


> // open the new file
> if((outfile = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,PERM)) == -1){
> close(infile);
> exit(-1);
> }
>
> // loop that does the copying
> while((nread = read(infile,buffer,BUFSIZE)) > 0){
>
> if( write(outfile,buffer,nread)){


Ehh... write returnerer antall bytes den greide å skrive. Testen er
_litt_ feil.


> close(infile);
> close(outfile);
> exit(-1);


Negative returverdier er en uting. Don't do that.


> men programmet kopier kun noget af filen.


De første 512 bytes, tenker jeg.


> ps. programmet er også vedhæftet.


Det vedheftede programmet kompilerer ikke. Og det kan heller ikke
kompileres av noe som kan kalles en C kompilator.





ivr
--
Besides, meat tends to run away when possible, or fights. Either
response presents behavioral challenges too complex for any existing
robot.
      -- Stuart Wilkinson, inventor of the "gastrobot"

Jesper Kampfeldt (05-03-2001)
Kommentar
Fra : Jesper Kampfeldt


Dato : 05-03-01 16:44


Igor V. Rafienko <igorr@ifi.uio.no> skrev i en
nyhedsmeddelelse:xjv3dcszhqq.fsf@bilskirnir.ifi.uio.no...

> > void buffer[BUFSIZE];
>
>
> Siden når ble det lov å ha arrays av void:
>

det er en selvfølglig en fejl, i mit program står der "char
buffer[BUFSIZE]", og så
vil mit program gerne compile.

der hvor det går galt er i read, den læser simplethen ikke hele filen ind,
hvorfor ?

jesper



Igor V. Rafienko (05-03-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 05-03-01 19:14

* Jesper Kampfeldt

[snip]

> der hvor det går galt er i read, den læser simplethen ikke hele
> filen ind, hvorfor ?


Jeg svarte allerede: det er ikke read som er problemet, men write. Hva
returnerer write? Og hvordan bruker du denne verdien i if-testen?





ivr
--
Besides, meat tends to run away when possible, or fights. Either
response presents behavioral challenges too complex for any existing
robot.
      -- Stuart Wilkinson, inventor of the "gastrobot"

Jesper Kampfeldt (05-03-2001)
Kommentar
Fra : Jesper Kampfeldt


Dato : 05-03-01 22:32


Igor V. Rafienko <igorr@ifi.uio.no> skrev i en
nyhedsmeddelelse:xjv7l24gk2f.fsf@stjorn.ifi.uio.no...
> Jeg svarte allerede: det er ikke read som er problemet, men write. Hva
> returnerer write? Og hvordan bruker du denne verdien i if-testen?

if( write(outfile,buffer,nread)<nread){


Jesper



Igor V. Rafienko (06-03-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 06-03-01 10:07

* Jesper Kampfeldt

> > Jeg svarte allerede: det er ikke read som er problemet, men write.
> > Hva returnerer write? Og hvordan bruker du denne verdien i
> > if-testen?
>
> if( write(outfile,buffer,nread)<nread){


Dette

[quote]

> // loop that does the copying
> while((nread = read(infile,buffer,BUFSIZE)) > 0){
>
> if( write(outfile,buffer,nread)){

[/quote]

postet du opprinnelig. See the difference?





ivr
--
Besides, meat tends to run away when possible, or fights. Either
response presents behavioral challenges too complex for any existing
robot.
      -- Stuart Wilkinson, inventor of the "gastrobot"

Jesper Kampfeldt (06-03-2001)
Kommentar
Fra : Jesper Kampfeldt


Dato : 06-03-01 12:32


Igor V. Rafienko <igorr@ifi.uio.no> skrev i en
nyhedsmeddelelse:xjv1ysbw9j7.fsf@heidrek.ifi.uio.no...
> postet du opprinnelig. See the difference?

Jep, men det virker stadig ikke, det er som den ikke kan lide binære filer ?

Jesper





Igor V. Rafienko (06-03-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 06-03-01 12:45

* Jesper Kampfeldt
> Igor V. Rafienko <igorr@ifi.uio.no> skrev i en
> nyhedsmeddelelse:xjv1ysbw9j7.fsf@heidrek.ifi.uio.no...
> > postet du opprinnelig. See the difference?
>
> Jep, men det virker stadig ikke, det er som den ikke kan lide binære
> filer ?


Ehh... dersom man retter opp if-testen i koden din, så snurrer ting
som en drøm iallfall på Linux med gcc-2.95.2 og Solaris med gcc-2.95.2
og cc5.0/5.1.





ivr
--
Besides, meat tends to run away when possible, or fights. Either
response presents behavioral challenges too complex for any existing
robot.
      -- Stuart Wilkinson, inventor of the "gastrobot"

Per Abrahamsen (05-03-2001)
Kommentar
Fra : Per Abrahamsen


Dato : 05-03-01 11:27

"Jesper Kampfeldt" <jesper@kampfeldt.com> writes:

> men programmet kopier kun noget af filen.

read/write er lavniveau systemkald, der ikke er beregnet til brug i
normale applikationer. Jeg forslår du bruger stdio og fread/fwrite i
stedet for, eller læser manualsiderne til read/write meget
omhyggeligt. De er _ikke_ lette at bruge korrekt.

Regnar Bang Lyngso (07-03-2001)
Kommentar
Fra : Regnar Bang Lyngso


Dato : 07-03-01 19:15

In article <97ukm6$2pii$1@news.cybercity.dk>, "Jesper Kampfeldt" <jesper@kampfeldt.com> writes:

JK> Hejsa jeg har et lille problem. Jeg bruger cygwin's gcc som
JK> compiler på windows 98.

Som andre har påpeget løses opgaven nok mere elegant med fopen og
lignende fra <stdio.h>.

Et forslag (som er testet på WinNT):

#include <stdio.h>

#define BUFSIZE 512U

enum stream_cp_errors {
CP_SUBTYPE = 0x0ff,
CP_WARN = 0x100,
CP_UNBUF,
STREAM_CP_MAXWARN,
CP_ERR = 0x200,
CP_SRC_READ,
CP_DST_WRITE,
STREAM_CP_MAXERR
};

enum file_cp_errors {
CP_SRC_OPEN = STREAM_CP_MAXERR,
CP_DST_OPEN,
FILE_CP_MAXERR
};

int stream_cp(FILE *src, FILE* dest) {
char buffer[BUFSIZE];
int warning = 0;
size_t nread;

/* ensure correct operation of ferror on output stream */
if (setvbuf(dest, NULL, _IONBF, 0U))
warning = CP_UNBUF;

/* loop that does the copying */
while(!feof(src)) {
nread = fread(buffer, sizeof(char), BUFSIZE * sizeof(char),
src);
if (ferror(src)) return CP_SRC_READ;
fwrite(buffer, sizeof(char), nread, dest);
if (ferror(dest)) return CP_DST_WRITE;
}

return warning;
}


int file_cp(char *src, char *dest) {
FILE *in_stream, *out_stream;
int error;

/* open the file to copy */
if ((in_stream = fopen(src,"rb")) == NULL)
return CP_SRC_OPEN;

/* open the new file */
if ((out_stream = fopen(dest, "wb")) == NULL) {
fclose(in_stream);
return CP_DST_OPEN;
}

warning = stream_cp(in_stream, out_stream);

fclose(in_stream);
fclose(out_stream);

return error;
}

int main(int argc, char *argv[]) {
int cp_error;

/* check for two and only two parameters */
if (argc != 3){
fprintf(stderr, "ERROR: Please specify two and only two filenames\n");
exit(1);
}

cp_error = file_cp(argv[1], argv[2]);

/* Error or warning */
switch (cp_error & ~CP_SUBTYPE) {
case CP_WARN:
fprintf(stderr, "WARNING: ");
break;
case CP_ERR:
fprintf(stderr, "ERROR: ");
break;
}

/* Which error or warning */
switch (cp_error) {
case 0:
break;
case CP_UNBUF :
fprintf(stderr,
"Unable to write unbuffered to destination file %s\n"
"Destination file might be garbled\n",
argv[2]);
break;
case CP_SRC_OPEN:
fprintf(stderr,
"Unable to open source file: %s\n",
argv[1]);
break;
case CP_DST_OPEN:
fprintf(stderr,
"Unable to create destination file: %s\n",
argv[2]);
break;
case CP_SRC_READ:
fprintf(stderr,
"While reading source file: %s\n",
argv[1]);
break;
case CP_DST_WRITE:
fprintf(stderr,
"While writing to destination file: %s\n",
argv[2]);
break;
default:
fprintf(stderr, "Unknown!\n");
break;
}

return cp_error;
}




Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste