|
| 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;
}
| |
|
|