对同一个txt文件进行读写操作

qianluoxun 2017-08-12 06:42:56
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 100
int main (void)
{
FILE *source;
char name[SIZE];
char ch;

printf("enter filename :");
gets(name);
if((source=fopen(name,"a+"))==NULL)
{
printf("can't open %s.",name);
exit(EXIT_FAILURE);
}

while((ch=getc(source))!=EOF)
{
ch=toupper(ch);
putc(ch,source);
}
if(fclose(source)!=0)
fprintf(stderr,"Error in closing file");

return 0;
}


为啥这样不成功?
“a+”不是可以进行读写操作??
...全文
279 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-08-14
  • 打赏
  • 举报
回复
引用 9 楼 jha334201553 的回复:
对了,仔细看了下,错误还真多,基本的,fgetc、fputc 写成了 getc、putc 还有C语言有缓冲机制,你 fgetc 一个数据,其实是读取了 4096 个字节,文件早就到EOF了,你再fputc、或者fgetc去哪了? 而且写完数据要随时更新的文件,不然下次读写,缓冲机制,呵呵,你懂的。。 所以正确的代码应该是:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 100
int main (void)
{
	FILE *source;
	char name[SIZE];
	char ch;
	
	printf("enter filename :");
	gets(name);
	if((source=fopen(name,"r+"))==NULL)
	{
		printf("can't open %s.",name);
		exit(EXIT_FAILURE);
	}
	
	while((ch=fgetc(source))!=EOF)
	{
		ch=toupper(ch);
        fseek(source, -1, SEEK_CUR);
		fputc(ch, source);
        fflush(source);
	}
	if(fclose(source)!=0)
		fprintf(stderr,"Error in closing file");
	
	return 0;
}
我查了下文档,孤陋寡闻了,确实有putc,getc读写文件的
「已注销」 2017-08-14
  • 打赏
  • 举报
回复
对了,仔细看了下,错误还真多,基本的,fgetc、fputc 写成了 getc、putc 还有C语言有缓冲机制,你 fgetc 一个数据,其实是读取了 4096 个字节,文件早就到EOF了,你再fputc、或者fgetc去哪了? 而且写完数据要随时更新的文件,不然下次读写,缓冲机制,呵呵,你懂的。。 所以正确的代码应该是:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 100
int main (void)
{
	FILE *source;
	char name[SIZE];
	char ch;
	
	printf("enter filename :");
	gets(name);
	if((source=fopen(name,"r+"))==NULL)
	{
		printf("can't open %s.",name);
		exit(EXIT_FAILURE);
	}
	
	while((ch=fgetc(source))!=EOF)
	{
		ch=toupper(ch);
        fseek(source, -1, SEEK_CUR);
		fputc(ch, source);
        fflush(source);
	}
	if(fclose(source)!=0)
		fprintf(stderr,"Error in closing file");
	
	return 0;
}
「已注销」 2017-08-14
  • 打赏
  • 举报
回复
a+ 是 r+ 的基础上再设置文件读取位置到末尾 fseek(source, 0, SEEK_END); 都已经文件末尾了,你去read 肯定EOF啊,r+ 在文件首部,read可以从前到后获取数据但你这代码是有问题的。,读一个或者写一个文件位置都后移一个位置了。如果文件内容为: abcdefgh 运行完就是: aAcCeEfFhH
棉猴 2017-08-13
  • 打赏
  • 举报
回复
至于"r+"和“a+”的区别,MSDN给出的两个不同的单词:“r+”是“update”(覆盖),“a+”是“append”(添加)。英文解释应该好理解些。所以以上代码成功的前提是使用fopen_s()函数打开文件的权限是"r+",而不是"a+"
棉猴 2017-08-13
  • 打赏
  • 举报
回复

fpos_t pos = 0;
    while ((ch = getc(source)) != EOF)
    {
        fgetpos(source, &pos);
        ch = toupper(ch);
        pos -= 1;
       //读操作切换到写操作
        fsetpos(source, &pos);
        putc(ch, source);
      //写操作切换到读操作
        fflush(source);
         //如不使用fflsuh()函数,可以如下的设置位置函数
        //pos += 1;
        //fsetpos(source, &pos);
    }
hijack00 2017-08-13
  • 打赏
  • 举报
回复
引用 4 楼 qianluoxun 的回复:
[quote=引用 3 楼 hijack00 的回复:] [quote=引用 2 楼 qianluoxun 的回复:] [quote=引用 1 楼 hijack00 的回复:] a+" = "at+",表示打开或新建一个文本文件,可以读,但只允许在文件末尾追写(append)。 你代码的意思是从文件中读取一个字符,转换为相应的大写字母形式之后写入相同位置,这是做不到的——因为a+模式下只能追加,即只能在最后一个字符后面写入字符。 建议了解一下C语言文件读写函数的内部实现机制,具体地,可以看看fseek,ftell,rewind这几个函数。
那这样的话 用“r+”呢??[/quote] 你还是先了解一下C语言文件打开时的各种模式吧(百度一下,相关资料很多)。r是以读模式打开,是不能写的,所以不行[/quote] r是不能写的,我知道,但我问的是r+,百度说,r+是可以写的[/quote] 这个我没试过,你可以试试看
qianluoxun 2017-08-13
  • 打赏
  • 举报
回复
引用 3 楼 hijack00 的回复:
[quote=引用 2 楼 qianluoxun 的回复:] [quote=引用 1 楼 hijack00 的回复:] a+" = "at+",表示打开或新建一个文本文件,可以读,但只允许在文件末尾追写(append)。 你代码的意思是从文件中读取一个字符,转换为相应的大写字母形式之后写入相同位置,这是做不到的——因为a+模式下只能追加,即只能在最后一个字符后面写入字符。 建议了解一下C语言文件读写函数的内部实现机制,具体地,可以看看fseek,ftell,rewind这几个函数。
那这样的话 用“r+”呢??[/quote] 你还是先了解一下C语言文件打开时的各种模式吧(百度一下,相关资料很多)。r是以读模式打开,是不能写的,所以不行[/quote] r是不能写的,我知道,但我问的是r+,百度说,r+是可以写的
hijack00 2017-08-12
  • 打赏
  • 举报
回复
引用 2 楼 qianluoxun 的回复:
[quote=引用 1 楼 hijack00 的回复:] a+" = "at+",表示打开或新建一个文本文件,可以读,但只允许在文件末尾追写(append)。 你代码的意思是从文件中读取一个字符,转换为相应的大写字母形式之后写入相同位置,这是做不到的——因为a+模式下只能追加,即只能在最后一个字符后面写入字符。 建议了解一下C语言文件读写函数的内部实现机制,具体地,可以看看fseek,ftell,rewind这几个函数。
那这样的话 用“r+”呢??[/quote] 你还是先了解一下C语言文件打开时的各种模式吧(百度一下,相关资料很多)。r是以读模式打开,是不能写的,所以不行
qianluoxun 2017-08-12
  • 打赏
  • 举报
回复
引用 1 楼 hijack00 的回复:
a+" = "at+",表示打开或新建一个文本文件,可以读,但只允许在文件末尾追写(append)。 你代码的意思是从文件中读取一个字符,转换为相应的大写字母形式之后写入相同位置,这是做不到的——因为a+模式下只能追加,即只能在最后一个字符后面写入字符。 建议了解一下C语言文件读写函数的内部实现机制,具体地,可以看看fseek,ftell,rewind这几个函数。
那这样的话 用“r+”呢??
hijack00 2017-08-12
  • 打赏
  • 举报
回复
a+" = "at+",表示打开或新建一个文本文件,可以读,但只允许在文件末尾追写(append)。 你代码的意思是从文件中读取一个字符,转换为相应的大写字母形式之后写入相同位置,这是做不到的——因为a+模式下只能追加,即只能在最后一个字符后面写入字符。 建议了解一下C语言文件读写函数的内部实现机制,具体地,可以看看fseek,ftell,rewind这几个函数。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧