Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #111823

Re: How to determine if file is binary or text?

From Michael Forsythe <forsythe@example.com>
Newsgroups comp.lang.c
Subject Re: How to determine if file is binary or text?
Date 2017-06-08 15:33 +0000
Organization A noiseless patient Spider
Message-ID <ohbqob$ep$1@dont-email.me> (permalink)
References <oh9h55$a0q$2@dont-email.me> <slrnojgstb.1kjn.grahn+nntp@frailea.sa.invalid> <oh9tla$p61$1@dont-email.me> <87poefe8h1.fsf@bsb.me.uk> <oha5b6$e96$2@dont-email.me>

Show all headers | View raw


DFS <nospam@dfs.com> wrote:

[snip]

> I'm on Windows, but I installed the GNUWin32 port which includes 
> 'file.exe' (the Linux 'file' command).
> 
> 
> int is_textfile(char *fname)
> {
>        char cmd[] = {0};
>        sprintf(cmd,"file %s",fname);
>        char *ftype = {system(cmd)};
>        printf("filetype = %s\n",ftype);
> }
> 
> 
> output is
> 
> filename.txt; ASCII English text, with very long lines, with CRLF line 
> terminators
> filetype = (null)
> 
> 
> So it runs the 'file' command and prints it, but it isn't getting 
> captured in the ftype variable.

Others have mentioned popen, and you've already discovered the pain
that comes with that. At least on my systems, file comes with the
helpful libmagic library. If you can link against that:

        #include <stdio.h>
        #include <string.h>
        
        #include <magic.h>
        
        static magic_t mime_cookie;
        
        int is_textfile(const char *fname)
        {
                return !strcmp(magic_file(mime_cookie, fname),
                               "text/plain");
        }
        
        int main(int argc, char **argv)
        {
                if (!(mime_cookie = magic_open(MAGIC_MIME_TYPE))) {
                        perror("magic_open");
                        return -1;
                }
        
                if (magic_load(mime_cookie, 0) < 0) {
                        perror("magic_load");
                        return -1;
                }
        
                if (argc != 2) {
                        printf("Usage: %s /path/to/file\n", argv[0]);
                        return -1;
                }
        
                if (is_textfile(argv[1])) {
                        printf("Yup\n");
                } else {
                        printf("Nope\n");
                }
        
                return 0;
        }

        $ cc -std=c99 -o a a.c -lmagic
        $ ./a /dev/kmem
        Nope
        $ ./a c89-draft.txt
        Yup
        $ ./a n1256.pdf
        Nope
        $ ./a UTF-8-demo.txt
        Yup

The library also has magic_buffer in case you've already loaded the
file into memory.

Of course, as others have already said, you probably want to do
some processing with the file after you've loaded it (treat it as
a configuration file, extract all email addresses, treat it as a
sequence of SAN chess moves, whatever). If so, you're probably
better off treating the file as a bunch of bytes and attempting to
specifically validate for whatever you're going to use the file
for.

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

How to determine if file is binary or text? DFS <nospam@dfs.com> - 2017-06-07 14:40 -0400
  Re: How to determine if file is binary or text? GOTHIER Nathan <nathan.gothier@gmail.com> - 2017-06-07 20:46 +0200
  Re: How to determine if file is binary or text? bartc <bc@freeuk.com> - 2017-06-07 19:58 +0100
  Re: How to determine if file is binary or text? scott@slp53.sl.home (Scott Lurndal) - 2017-06-07 19:05 +0000
  Re: How to determine if file is binary or text? supercat@casperkitty.com - 2017-06-07 12:10 -0700
  Re: How to determine if file is binary or text? "James R. Kuyper" <jameskuyper@verizon.net> - 2017-06-07 16:25 -0400
  Re: How to determine if file is binary or text? Jorgen Grahn <grahn+nntp@snipabacken.se> - 2017-06-07 21:44 +0000
    Re: How to determine if file is binary or text? DFS <nospam@dfs.com> - 2017-06-07 18:14 -0400
      Re: How to determine if file is binary or text? GOTHIER Nathan <nathan.gothier@gmail.com> - 2017-06-08 00:23 +0200
        Re: How to determine if file is binary or text? Robert Wessel <robertwessel2@yahoo.com> - 2017-06-08 00:11 -0500
          Re: How to determine if file is binary or text? GOTHIER Nathan <nathan.gothier@gmail.com> - 2017-06-08 15:14 +0200
            Re: How to determine if file is binary or text? Robert Wessel <robertwessel2@yahoo.com> - 2017-06-08 11:06 -0500
          Re: How to determine if file is binary or text? raltbos@xs4all.nl (Richard Bos) - 2017-06-17 18:28 +0000
      Re: How to determine if file is binary or text? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2017-06-07 23:30 +0100
        Re: How to determine if file is binary or text? DFS <nospam@dfs.com> - 2017-06-07 20:26 -0400
          Re: How to determine if file is binary or text? bartc <bc@freeuk.com> - 2017-06-08 01:30 +0100
            Re: How to determine if file is binary or text? DFS <nospam@dfs.com> - 2017-06-07 23:50 -0400
              Re: How to determine if file is binary or text? mark.bluemel@gmail.com - 2017-06-08 02:13 -0700
                Re: How to determine if file is binary or text? mark.bluemel@gmail.com - 2017-06-08 04:05 -0700
                Re: How to determine if file is binary or text? DFS <nospam@dfs.com> - 2017-06-08 09:21 -0400
                Re: How to determine if file is binary or text? Ike Naar <ike@iceland.freeshell.org> - 2017-06-08 14:19 +0000
                Re: How to determine if file is binary or text? DFS <nospam@dfs.com> - 2017-06-08 12:07 -0400
                Re: How to determine if file is binary or text? scott@slp53.sl.home (Scott Lurndal) - 2017-06-08 16:14 +0000
                Re: How to determine if file is binary or text? DFS <nospam@dfs.com> - 2017-06-08 12:37 -0400
                Re: How to determine if file is binary or text? scott@slp53.sl.home (Scott Lurndal) - 2017-06-08 16:54 +0000
                Re: How to determine if file is binary or text? DFS <nospam@dfs.com> - 2017-06-08 13:14 -0400
                An old version of what??? (Was: How to determine if file is binary or text?) gazelle@shell.xmission.com (Kenny McCormack) - 2017-06-09 17:13 +0000
              Re: How to determine if file is binary or text? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2017-06-08 11:15 +0100
          Re: How to determine if file is binary or text? scott@slp53.sl.home (Scott Lurndal) - 2017-06-08 12:49 +0000
          Re: How to determine if file is binary or text? Jorgen Grahn <grahn+nntp@snipabacken.se> - 2017-06-08 14:01 +0000
          Re: How to determine if file is binary or text? Michael Forsythe <forsythe@example.com> - 2017-06-08 15:33 +0000
            Re: How to determine if file is binary or text? DFS <nospam@dfs.com> - 2017-06-08 18:43 -0400
              Re: How to determine if file is binary or text? jak <please@nospam.tnx> - 2017-06-09 08:46 +0200
      Re: How to determine if file is binary or text? "James R. Kuyper" <jameskuyper@verizon.net> - 2017-06-07 19:23 -0400
      Re: How to determine if file is binary or text? Barry Schwarz <schwarzb@dqel.com> - 2017-06-07 16:50 -0700
      Re: How to determine if file is binary or text? "Pascal J. Bourguignon" <pjb@informatimago.com> - 2017-06-08 15:51 +0200
  Re: How to determine if file is binary or text? Joe Pfeiffer <pfeiffer@cs.nmsu.edu> - 2017-06-07 17:17 -0600
    Re: How to determine if file is binary or text? Keith Thompson <kst-u@mib.org> - 2017-06-07 19:21 -0700
      Re: How to determine if file is binary or text? Joe Pfeiffer <pfeiffer@cs.nmsu.edu> - 2017-06-07 21:37 -0600
  Re: How to determine if file is binary or text? Noob <root@127.0.0.1> - 2017-06-08 08:40 +0200
  Re: How to determine if file is binary or text? gordonb.t9rom@burditt.org (Gordon Burditt) - 2017-06-08 12:03 -0500

csiph-web