C语言文件操作
想实现把文件里的字符转成大写在写回去,可是出现问题,无限循环。比如:文件内容为abcde运行程序后ABBBBBBBBBBBBBB.........b不知问题在那,还请各位...
想实现把文件里的字符转成大写在写回去,可是出现问题,无限循环。
比如:
文件内容为 abcde
运行程序后 ABBBBBBBBBBBBBB.........b
不知问题在那,还请各位前辈们帮帮我,谢谢了!
代码如下
int main(int argc, char* argv[])
{
FILE *fp = fopen("C:\\1.txt", "r+");
char c;
c = fgetc(fp);
while (!feof(fp))
{
fseek(fp, ftell(fp) - 1, SEEK_SET);
fputc(toupper(c), fp);
c = fgetc(fp);
}
fclose(fp);
return 0;
}
没出错,就是死循环, 展开
比如:
文件内容为 abcde
运行程序后 ABBBBBBBBBBBBBB.........b
不知问题在那,还请各位前辈们帮帮我,谢谢了!
代码如下
int main(int argc, char* argv[])
{
FILE *fp = fopen("C:\\1.txt", "r+");
char c;
c = fgetc(fp);
while (!feof(fp))
{
fseek(fp, ftell(fp) - 1, SEEK_SET);
fputc(toupper(c), fp);
c = fgetc(fp);
}
fclose(fp);
return 0;
}
没出错,就是死循环, 展开
2个回答
展开全部
今晚调试了很多遍,还是没发现我敢很确定的错误。
我的看法是:以r+方式打开文件时读取数据fgetc和写入数据fputc共用一个缓冲区,这样fputc如果不能及时将第二个字符b转换后写入文件,就会被fgetc捕捉到,这样就在第二个字符时形成死循环了。因为自己对文件缓冲区了解甚少,所以我的观点我也不能确定是否正确。
改了一下,运行结果正确,但是我不敢保证程序完全正确。其实涉及文件操作时,下面这两种方式更常见(网上示例代码很多):
一、读方式打开1.txt,写方式打开2.txt,把1.txt中的字母赋给一个char变量,然后将这个char变量转换为大写,再写到2.txt中。
二、先读,读完后再写
修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char* argv[])
{
char c;
FILE *fp = fopen("C:\\1.txt", "r+");
if(NULL == fp)
{
perror("fopen failed");
exit(EXIT_FAILURE);
}
c = fgetc(fp);
while (!feof(fp))
{
if(islower(c) != 0)
{
fseek(fp, ftell(fp) - 1, SEEK_SET);
// 也可以用fseek(fp, -1, SEEK_CUR);替换
fputc(toupper(c), fp);
if(EOF == fflush(fp)) // 使数据及时写入文件而不是留在缓冲区
{
perror("fflush failed");
fclose(fp);
exit(EXIT_FAILURE);
}
}
c = fgetc(fp);
}
fclose(fp);
return 0;
}
如果我的回答有问题,可以HI我,我们接着讨论。
我的看法是:以r+方式打开文件时读取数据fgetc和写入数据fputc共用一个缓冲区,这样fputc如果不能及时将第二个字符b转换后写入文件,就会被fgetc捕捉到,这样就在第二个字符时形成死循环了。因为自己对文件缓冲区了解甚少,所以我的观点我也不能确定是否正确。
改了一下,运行结果正确,但是我不敢保证程序完全正确。其实涉及文件操作时,下面这两种方式更常见(网上示例代码很多):
一、读方式打开1.txt,写方式打开2.txt,把1.txt中的字母赋给一个char变量,然后将这个char变量转换为大写,再写到2.txt中。
二、先读,读完后再写
修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char* argv[])
{
char c;
FILE *fp = fopen("C:\\1.txt", "r+");
if(NULL == fp)
{
perror("fopen failed");
exit(EXIT_FAILURE);
}
c = fgetc(fp);
while (!feof(fp))
{
if(islower(c) != 0)
{
fseek(fp, ftell(fp) - 1, SEEK_SET);
// 也可以用fseek(fp, -1, SEEK_CUR);替换
fputc(toupper(c), fp);
if(EOF == fflush(fp)) // 使数据及时写入文件而不是留在缓冲区
{
perror("fflush failed");
fclose(fp);
exit(EXIT_FAILURE);
}
}
c = fgetc(fp);
}
fclose(fp);
return 0;
}
如果我的回答有问题,可以HI我,我们接着讨论。
参考资料: http://hi.baidu.com/microtool/blog/item/636565e82db6d83a2df53492.html
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询