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

时间:2014-10-05 21:42:26

标签: utf-8 size fgets utf-16 unicode-string

我有一个从.txt文件中读取的程序

我使用cmd提示符执行程序,其中包含要读取的文本文件的名称。

ex: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
     }
}

无论是否有效,while循环中的代码都会被执行。

当它工作时,tmp实际上有一个值。 当它不起作用时,tmp没有价值。

编辑:

感谢sneftel,我们知道问题是什么, 对于我来说使用fgetws()而不是fgets(),我需要将tmp变成wchar_t *而不是char *。 类型转换似乎不起作用。 我尝试将tmp的声明更改为     wchar_t tmp [1024] = {0x0}; 但我意识到tmp是我的代码中其他地方使用的strtok()中的参数。 我在这里就是我尝试过的功能:

//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");
    }
}

但是在strtok中对char *进行类型转换也不起作用。

现在我正在寻找一种方法将文件从UTF-16转换为UTF-8,因此tmp可以是char *类型 我发现这看起来很有用,但在示例中它使用来自用户的输入作为UTF-16,如何从文件中取出输入? http://www.cplusplus.com/reference/locale/codecvt/out/

1 个答案:

答案 0 :(得分:1)

这听起来很像原始文件是UTF-16编码的。在文本编辑器中复制/粘贴它时,然后将结果保存为新的(默认编码)(ASCII或UTF-8)文本文件。由于单个字符在UTF-16编码文件中占用2个字节,而在UTF-8编码文件中只占1个字节,因此当您将其保存时,文件大小将大致减半。

UTF-16很好,但您需要使用支持Unicode的功能(即不是fgets)才能使用它。如果您现在不想处理所有Unicode爵士乐,并且您实际上没有任何非ASCII字符可以在文件中处理,只需进行手动转换(使用您的复制/粘贴或使用命令行实用程序)在运行程序之前。