我的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'.如果它依赖于语言环境,则此代码不可移植.我不想暂时改变语言环境直到我写.我想知道更好的方法,如读取原始文件的编码格式,用该编码/格式打开第二个文件.
它与编码无关,你在代码片段中所做的一切都不会受到影响$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 );
在循环终止之前调用.