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

res*_*way 1 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);
         }
Run Code Online (Sandbox Code Playgroud)

仅供参考 - 我尝试使用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
Run Code Online (Sandbox Code Playgroud)

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

Ing*_*rdt 7

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

while (!feof(fp)) {
    ch = fgetc(fp);
    ...
    fprintf(fp1, "%c", ch);
}
Run Code Online (Sandbox Code Playgroud)

正如你在这里发现的很多帖子一样,feof(fp)在一次调用fgetc(fp)返回EOF(-1)之前不会变为TRUE .但是你不检查那个特殊的返回值,所以你fprintf( fp1, "%c", -1 );在循环终止之前调用.

  • BTW:如果`ch`是`char`,则会出现另一个问题.`fgetc()`通常返回256个不同的`unsigned char`或`EOF`中的1个.这些不同的257值不能用`char`编码.最好用`int ch;`. (2认同)