C语言(文件读取以及怎样避免fscanf连续读取不同类型变量时出错)

一.控制台与文件内容之间的转换。
注:下面的fopen,freopen,feof,fscanf,fprintf等函数都在stdio.h头文件里。

1.控制台——文件
@1.fopen 函数(涉及到的函数:fscanf, fprintf, fputs, fgets 等)

	FILE *fp;// FILE 是文件类型的声明,fp即为指向文件的指针。
	fp=fopen(“C:\\Users\\CB1030205454\\Desktopr\\data.dat”,”a+“);//fp=fopen(“路径及文件名称”,”打开方式“);fopen函数原型为FILE * fopen(const char * path, const char * mode);
	if(fp==NULL)
	{puts("打开文件失败!");
	return -1;
	}
	scanf("%s",a);//int a[40]
	fprintf(fp,"%s",a);
	同理
	while(!feof(fp))判断是否已读到文件末尾,
	{
	fscanf(fp,"%s",b);//int b[40]
	}
	printf("%s",b);
	fclose(fp);//文件操作结束时别忘了关闭指针!
	**

!!!P.S:在使用fscanf读取文件时,特别是连续读取不同类型变量的时候,最好同时在文件和fscanf里面用同样多的空格隔开,(其他类型变量也可以用“,” “|”之类的隔开,但字符串数组型只能用相应的空格隔开),这样才能避免读取出错。

	P.S.:至于相对路径与绝对路径的问题:
			相对路径:文件名(默认为其与源文件,头文件在同一目录及文件夹下);eg:”data.txt“或“12\\data.txt”(其中12为临近的上一文件夹)。
			绝对路径:路径+文件名;eg:“C:\\Users\\CB1030205454\\Desktopr\\data.txt”。

@2.freopen函数(可以正常使用scanf,printf等函数)

freopen(“data.dat”,”w“,stdout);//重定向,输出数据到文件。
scanf("%s",a);// char a[40]
printf("%s",a);//输出数据到文件
freopen("CON","w",stdout);//重定向,输出数据再次到控制台。

freopen(“C:\\Users\\CB1030205454\\Desktopr\\data.dat”,”r“,stdin);//重定向,读取文件中的数据。
scanf("%s",a);// char a[40]//读取文件中的数据
printf("%s",a);//在控制台上输出数据
freopen("CON","r",stdin);//重定向,在控制台上读取数据。

具体文件操作如下:
r 以只读方式打开文件,该文件必须存在。
r+ 以读/写方式打开文件,该文件必须存在。
rb+ 以读/写方式打开一个二进制文件,只允许读/写数据。
rt+ 以读/写方式打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文 件不存在则创建该文件。
w+ 打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。
a 以附加的方式打开只写文件。若文件不存在,则会创建该文件;如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF 符保留)。
a+ 以附加方式打开可读/写的文件。若文件不存在,则会创建该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF符不保留)。
wb 以只写方式打开或新建一个二进制文件,只允许写数据。
wb+ 以读/写方式打开或新建一个二进制文件,允许读和写。
wt+ 以读/写方式打开或新建一个文本文件,允许读和写。
at+ 以读/写方式打开一个文本文件,允许读或在文本末追加数据。
ab+ 以读/写方式打开一个二进制文件,允许读或在文件末追加数据。
二.判断文件读取结束的方法。

1.使用EOF(遇到int型没问题,char型可能有问题(字符“FF”会误判为文件结束))

   int  c;
   int a[100]
    while((c=fgetc(fp))!=EOF)
    {
    fscanf(“%c”,a);
    }

2.feof函数

	char c;
	while(!fgetc(fp))
	{
	fscanf(fp,"%c",&c);
	printf("%c",c);
	}

三.多文件项目的建立

主要分为:main函数,分函数,头文件。

如:main.c; funs.c; txt.h;
1.main.c:主要是包含的头文件和主函数。
2.funs.c: 头文件和各个功能函数。
3.txt.h:宏定义,结构体,函数名,数组等的声明。

eg:

txt.h:
  #ifndef TXT_H_INCLUDED//ifndef...endif 是为防止重复定义。
	 #define TXT_H_INCLUDED
     #define N 100

     typedef char TYPE;
     TYPE a[N],b[N];

     void print();
     void scan();
  #endif //TXT_H_INCLUDED

funs.c :

#include"txt.h"
#include<stdio.h>
void print()
{
	FILE *fp;
	fp = fopen("C:\\Users\\CB1030205454\\Desktop\\putfs.txt", "a+");
	if (fp == NULL)
	{
		puts("文件读取失败!");
		return -1;
	}
	scanf(" %s", a);
	fprintf(fp ,"%s",a);
	fclose(fp);
}

main.c :

#include<stdio.h>
#include"txt.h"

int main()
{
	print();
	system("pause");
	return 0;
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值