Быстро "сшить" несколько utf-8 текстовых файлов в один
От: _hum_ Беларусь  
Дата: 02.02.17 10:50
Оценка:
собственно, сабж.
как это платформо-независимо правильнее сделать?
(читать текстовые файлы, насколько я понимаю, затратно, ибо в общем случае функции чтения делают перекодировку. при бинарном побайтовом же чтении не совсем понятно, как избавляться от EOF)

спасибо.
Re: Быстро "сшить" несколько utf-8 текстовых файлов в один
От: Pzz Россия https://github.com/alexpevzner
Дата: 02.02.17 11:00
Оценка: +4
Здравствуйте, _hum_, Вы писали:

__>(читать текстовые файлы, насколько я понимаю, затратно, ибо в общем случае функции чтения делают перекодировку. при бинарном побайтовом же чтении не совсем понятно, как избавляться от EOF)


В бинарном файле нет никакого EOF, эго присутствие там эмулируется функцией чтения, если мы говорим о файловых функциях семейства stdio.

Но вот в начале UTFного файла может быть (а может и не быть) BOM. Его не стоит копировать из файлов, кроме первого.
Re: Быстро "сшить" несколько utf-8 текстовых файлов в один
От: Videoman Россия https://hts.tv/
Дата: 02.02.17 12:00
Оценка:
Здравствуйте, _hum_, Вы писали:

__>собственно, сабж.

__>как это платформо-независимо правильнее сделать?
__>(читать текстовые файлы, насколько я понимаю, затратно, ибо в общем случае функции чтения делают перекодировку. при бинарном побайтовом же чтении не совсем понятно, как избавляться от EOF)

__>спасибо.


Просто, бинарно дописывать файлы в конец друг-друга. Никакого EOF там нет.
Re: Быстро "сшить" несколько utf-8 текстовых файлов в один
От: MasterZiv СССР  
Дата: 07.02.17 08:59
Оценка: -1
Здравствуйте, _hum_, Вы писали:

__>собственно, сабж.


Собственно, cat.
Re: Быстро "сшить" несколько utf-8 текстовых файлов в один
От: kov_serg Россия  
Дата: 07.02.17 10:13
Оценка: :))
Здравствуйте, _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;
}

"сшить" можно как-то так
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.