文件输入输出
1.向文件中写入数据,每次读取值读取一整行,假定文件中每一行包含字符不超过20个。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char buf[40];
FILE *fp;
fp = fopen("a.txt","w+");
if(fp==NULL)
{
printf("error");
exit(0);
}
fputs("ABCDEFG\nAH AUI PPORW\nWIFDNCZXUIS\n * ",fp);
rewind(fp);
while(!feof(fp)){
fgets(buf,20,fp);
printf("%s",buf);
}
if(fclose(fp)!=0)
{
printf("closeerror");
}
return 0;
}
如果一行字符超过20个不影响结果因为下一次fgets继续读取。因为最大字符限制(fgets第二个参数)而读取结束的情况,真正读取到的字符回必最大字符限制少1,函数会自动添加一个结束标志使其中的字符变成字符串。如果发现有一条fgets读取数据但其缓冲数组打印为出“空”的情况,可能是上一次读取或对文件的操作使指针停留在换行符之前,造成了本次只打印一个换行符。
2.用户输入两个文件名,从标准输入读取他们,第一个作为输入文件,第二个作为输出文件。这个修改后的程序应该打开着两个文件吧输入文件的内容按行复制给输出文件。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char buf[40];
char f[20],f2[20];
FILE *fp,*fp2;
printf("请输入第一个文件名");
gets(f);
printf("请输入第一个文件名");
gets(f2);
fp = fopen(f,"w+");
fp2 = fopen(f2,"a+");
if(fp==NULL||fp==NULL)
{
printf("error");
exit(0);
}
fputs("ABCDEFG\nAH AUI PPORW\nWIFDNCZXUIS\n * ",fp);
rewind(fp);
while(!feof(fp)){
fgets(buf,20,fp);
fputs(buf,fp2);
}
if(fclose(fp)!=0||fclose(fp2))
{
printf("closeerror");
}
return 0;
}
查询上面文件以整数开始的行,对这些整数值进行求和再写入到输出文件尾部。
fgets函数对一整行的定义不明确,而且就算取出正好一行也仅仅是对第一个字符进行操作。使用getc取出字符,flag位为当前字符是否为首字符,初值为1,当读取到一个换行符时,下一个字符必为首字符。如果取到的字符是整数则将其转化为int型进行计算,将计算结果再转换为字符型,向目标文件中写入。