собственно, сабж.
как это платформо-независимо правильнее сделать?
(читать текстовые файлы, насколько я понимаю, затратно, ибо в общем случае функции чтения делают перекодировку. при бинарном побайтовом же чтении не совсем понятно, как избавляться от EOF)
спасибо.
Здравствуйте, _hum_, Вы писали:
__>(читать текстовые файлы, насколько я понимаю, затратно, ибо в общем случае функции чтения делают перекодировку. при бинарном побайтовом же чтении не совсем понятно, как избавляться от EOF)
В бинарном файле нет никакого EOF, эго присутствие там эмулируется функцией чтения, если мы говорим о файловых функциях семейства stdio.
Но вот в начале UTFного файла может быть (а может и не быть)
BOM. Его не стоит копировать из файлов, кроме первого.
Здравствуйте, _hum_, Вы писали:
__>собственно, сабж.
__>как это платформо-независимо правильнее сделать?
__>(читать текстовые файлы, насколько я понимаю, затратно, ибо в общем случае функции чтения делают перекодировку. при бинарном побайтовом же чтении не совсем понятно, как избавляться от EOF)
// gcc sshit.c -o sshit
#include <stdio.h>
int append(FILE *d,const char *src,int trim_bom) {
enum { buf_size=4096 };
FILE *s; int rd, res;
unsigned char buf[buf_size], *p;
unsigned char bom[]={0xEF,0xBB,0xBF};
res=1; s=fopen(src,"rb");
if (s) {
res=0;
while(!feof(s)) {
rd=fread(p=buf,1,buf_size,s);
if (trim_bom) { trim_bom=0;
if (rd>=3 && buf[0]==bom[0] && buf[1]==bom[1] && buf[2]==bom[2]) { p+=3; rd-=3; }
}
if (fwrite(p,1,rd,d)!=rd) { res=2; break; }
}
}
fclose(s);
return res;
}
int sshit2files(const char* dst,const char* first,const char* second) {
enum { buf_size=4096 };
int res; FILE *d; char buf[buf_size];
d=fopen(dst,"w+b"); if (!d) return 1;
res=append(d,first,0);
res=res||append(d,second,1);
fclose(d);
return res;
}
int main(int argc,char** argv) {
if (argc>3) return sshit2files(argv[1],argv[2],argv[3]);
printf("usage: sshit dst src1 src2\n");
return 1;
}
"сшить" можно как-то так