Utf 8 相同的.txt文件,不同的大小?

Utf 8 相同的.txt文件,不同的大小?,utf-8,size,fgets,utf-16,unicode-string,Utf 8,Size,Fgets,Utf 16,Unicode String,我有一个程序可以读取.txt文件 我使用cmd提示符以要读取的文本文件的名称执行程序 例如:program.exe myfile.txt 问题是,有时有效,有时无效 原始文件为130KB,无法工作。 如果复制/粘贴内容,则文件大小为65KB,可以正常工作。 如果我复制/粘贴文件并重命名它,它的大小为130KB,无法工作 有什么想法吗 经过更多的测试,它表明这是它无法工作的原因: int main(int argc, char *argv[]) { char *infile1 ch

我有一个程序可以读取.txt文件

我使用cmd提示符以要读取的文本文件的名称执行程序

例如:program.exe myfile.txt

问题是,有时有效,有时无效

原始文件为130KB,无法工作。 如果复制/粘贴内容,则文件大小为65KB,可以正常工作。 如果我复制/粘贴文件并重命名它,它的大小为130KB,无法工作

有什么想法吗

经过更多的测试,它表明这是它无法工作的原因:

int main(int argc, char *argv[])
{
    char *infile1
    char tmp[1024] = { 0x0 };
    FILE *in;
    for (i = 1; i < argc; i++)  /* Skip argv[0] (program name). */
    {
        if (strcmp(argv[i], "-sec") == 0)  /* Process optional arguments. */
        {
            opt = 1;  /* This is used as a boolean value. */

            /*
            * The last argument is argv[argc-1].  Make sure there are
            * enough arguments.
            */

            if (i + 1 <= argc - 1)  /* There are enough arguments in argv. */
            {
                /*
                * Increment 'i' twice so that you don't check these
                * arguments the next time through the loop.
                */

                i++;
                optarg1 = atoi(argv[i]);  /* Convert string to int. */

            }
        }
        else /* not -sec */
        {
            if (infile1 == NULL) {
                infile1 = argv[i];
            }
            else {
                if (outfile == NULL) {
                    outfile = argv[i];
                }
            }
        }
     }

     in = fopen(infile1, "r");    

     if (in == NULL) 
     {
           fprintf(stderr, "Unable to open file %s: %s\n", infile1, strerror(errno));
           exit(1);
     }

     while (fgets(tmp, sizeof(tmp), in) != 0)
     {
         fprintf(stderr, "string is %s.", tmp);
         //Rest of code
     }
}
但是在strtok中对char*的类型转换也不起作用

现在我正在寻找一种方法,将文件从UTF-16转换为UTF-8,这样tmp就可以是char类型* 我发现这看起来很有用,但在示例中,它使用来自用户的输入作为UTF-16,如何从文件中获取该输入?
听起来很像原始文件是UTF-16编码的。在文本编辑器中复制/粘贴时,将结果保存为新的(默认编码)(ASCII或UTF-8)文本文件。由于单个字符在UTF-16编码文件中占用2个字节,但在UTF-8编码文件中仅占用1个字节,因此在保存文件时,文件大小大约会减半


UTF-16还可以,但您需要使用Unicode感知函数(即,不是
fgets
)来处理它。如果您现在不想处理所有Unicode jazz,并且文件中实际上没有任何非ASCII字符可处理,只需在运行程序之前进行手动转换(使用复制/粘贴或命令行实用程序)。

谢谢!听起来可能是这样:)你知道我可以从哪里着手处理“所有的Unicode jazz”?大多数标准输入/输出例程都有广泛的字符版本。例如,请参阅
fgetws
的文档。问题是,您需要提前检测或知道文件具有宽字符编码。最好坚持使用ASCII或UTF-8;后者允许您使用包含字符串的国际字符执行相当多的操作,就好像它们是ASCII一样,尽管不是全部。
//tmp is passed as the first parameter in parse()
void parse(wchar_t *record, char *delim, char arr[][MAXFLDSIZE], int *fldcnt)
{
    if (*record != NULL)
    {
        char*p = strtok((char*)record, delim);
        int fld = 0;
        while (p) {
            strcpy(arr[fld], p);
            fld++;
            p = strtok('\0', delim);
        }
        *fldcnt = fld;
    }
    else
    {
        fprintf(stderr, "string is null");
    }
}