用于检查文件是否为空或包含ASCII文本的C文件

时间:2017-08-08 10:18:34

标签: c file segmentation-fault ascii fopen

我正在尝试编写一个程序,该程序应该能够在终端中将文件作为输入,然后确定文件是空的还是用ASCII文本写的。但我一直在分段错误11.

我的代码如下:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    unsigned char c;
    int size;

    FILE *file = fopen(argv[1], "r");

    fseek(&c, 0, SEEK_END);
    size = ftell(file);

    if (size == 0)
    {
        printf("file is empty\n");
    }

    fclose(file);

    FILE *file = fopen(argv[1], "r");
    c = fgetc(file);

    if (c != EOF && c <= 127)
    {
        printf("ASCII\n");
    }

    fclose(file);
}

为什么有任何想法?

3 个答案:

答案 0 :(得分:4)

1] fseek没有第一个参数unsgined char*,但是FILE*

fseek(file, 0, SEEK_END);

2]您不应使用unsigned char / char来检查EOF,请务必使用int

3]工作简单的代码

int main(int argc, char *argv[])
{
    if (argc < 2)
    {
        // err we havent filename
        return 1;
    }

    int c;

    FILE *file = fopen(argv[1], "r");
    if (file == NULL)
    {
        // err failed to open file
        return 1;
    }

    c = fgetc(file);

    if (c == EOF)
    {
        printf("empty\n");
        fclose(file);
        return 0;
    }
    else
    {
        ungetc(c, file);
    }

    while ((c = fgetc(file)) != EOF)
    {
        if (c < 0 || c > 127)
        {
            // not ascii
            return 1;
        }
    }

    printf("ascii\n");

    fclose(file);
    return 0;
}

答案 1 :(得分:2)

fseek(&c, 0, SEEK_END);

这里你应该传递文件描述符,比如

fseek(file, 0, SEEK_END);

答案 2 :(得分:1)

fseek将一个FILE *作为参数,你给它一个unsigned char * - 更改&amp; c to file。