C程序读取ascii文本文件但输出为ISO-8859

时间:2014-08-22 16:32:30

标签: c linux file

我的C程序读取一个ASCII文件,当我回写时,我以不同的格式(ISO-8859)获取它为什么是这样,我该如何控制它? 。

示例代码:

    fp = fopen(my_template_file_name, "r");
    if  ( fp == NULL )
        perror (" fopen \n");

    fp1 = fopen(*out_my_file, "w+");
    if  ( fp1 == NULL )
        perror (" fopen \n");

    while (!feof(fp)) {
        ch = fgetc(fp);
        if (ch == SEARCH_STRING[0]) { 
            bytes_read = fread(buf, 1, strlen (SEARCH_STRING) -1 , fp);
            if (bytes_read != bytes_to_read) {                      
                fprintf(fp1, "%s", buf);

            } else {

                if (strcmp(buf, SEARCH_STRING+1) == 0)
                    fprintf(fp1, "%s", MY_REPLACE);
                else {
                    fprintf(fp1, "%c", ch);
                    fprintf(fp1, "%s", buf);
                }
            }
            continue;
        }
        fprintf(fp1, "%c", ch);
         }

仅供参考 - 我尝试用rb wb打开和写作但无济于事。 因此,文件末尾的新行将转换为奇怪的字符

[root@localhost ]# cat /tmp/hello_template 
hello
[root@localhost ]# cat /tmp/hello
hello
�[root@localhost ]# file /tmp/hello_template 
/tmp/hello_template: ASCII text
[root@localhost ]# file /tmp/hello
/tmp/hello: ISO-8859 text

当我做gdb并查看fp时,有' \ n'在hello_template的末尾。 如果它依赖于语言环境,则此代码不可移植。我不想暂时改变语言环境直到我写。我想知道更好的方法,比如读取原始文件的编码格式,用该编码/格式打开第二个文件。

1 个答案:

答案 0 :(得分:7)

它与编码无关,您在代码段中所做的一切都不受$LANG的影响。真正的问题是:

while (!feof(fp)) {
    ch = fgetc(fp);
    ...
    fprintf(fp1, "%c", ch);
}

正如您在此处发现的很多帖子中所述,feof(fp)fgetc(fp)的一次调用返回EOF( - 1)之前不会变为TRUE。但是,您不会检查该特殊返回值,因此在循环终止之前调用fprintf( fp1, "%c", -1 );