我的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的末尾。 如果它依赖于语言环境,则此代码不可移植。我不想暂时改变语言环境直到我写。我想知道更好的方法,比如读取原始文件的编码格式,用该编码/格式打开第二个文件。
答案 0 :(得分:7)
它与编码无关,您在代码段中所做的一切都不受$LANG
的影响。真正的问题是:
while (!feof(fp)) {
ch = fgetc(fp);
...
fprintf(fp1, "%c", ch);
}
正如您在此处发现的很多帖子中所述,feof(fp)
在fgetc(fp)
的一次调用返回EOF
( - 1)之前不会变为TRUE。但是,您不会检查该特殊返回值,因此在循环终止之前调用fprintf( fp1, "%c", -1 );
。