C语言如何读取文件?

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

main()
{
FILE *fp1;//定义文件流指针,用于打开读取的文件
FILE *fp2;//定义文件流指针,用于打开写操作的文件
char text[1024];//定义一个字符串数组,用于存储读取的字符
fp1 = fopen("d:\\a.txt","r");//只读方式打开文件a.txt
fp2 = fopen("d:\\b.txt","w");//写方式打开文件a.txt
while(fgets(text,1024,fp1)!=NULL)//逐行读取fp1所指向文件中的内容到text中
{
puts(text);//输出到屏幕
fputs(text,fp2);//将内容写到fp2所指向文件中
}
fclose(fp1);//关闭文件a.txt,有打开就要有关闭
fclose(fp2);//关闭文件b.txt
}

这里为什么要有两个指针?一个指针可以吗?除了这样编写,还有什么方法,还有其它例子吗?
只是读取一个文件,这里为什么要有两个指针?

C语言读取文件的具体步骤如下:

我们需要准备的材料分别是:电脑、C语言。

1、首先我们打开需要读取的文件,点击打开左上角文件中的“另存为”。

2、然后我们在弹出来的窗口中点击打开保存类型。

3、然后我们在弹出来的窗口中点击选择“C source file(*.c)”,之后点击保存即可在C语言中读取出来了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-05-13
一个c语言读写文件程序:
#include
"stdio.h"
#include
<stdlib.h>
main()
{
FILE
*fp1;//定义文件流指针,用于打开读取的文件
FILE
*fp2;//定义文件流指针,用于打开写操作的文件
char
text[1024];//定义一个字符串数组,用于存储读取的字符
fp1
=
fopen("d:\\a.txt","r");//只读方式打开文件a.txt
fp2
=
fopen("d:\\b.txt","w");//写方式打开文件a.txt
while(fgets(text,1024,fp1)!=NULL)//逐行读取fp1所指向文件中的内容到text中
{
puts(text);//输出到屏幕
fputs(text,fp2);//将内容写到fp2所指向文件中
}
fclose(fp1);//关闭文件a.txt,有打开就要有关闭
fclose(fp2);//关闭文件b.txt
}
第2个回答  推荐于2017-11-26
一个文件流指针对应一个打开的文件,因为你要同时操作两个文件,所以要用两个文件流指针
,就像你要同时操作两个箱子一样.
这个程序可以这样理解:
有两个箱子,fp1,fp2;
打开箱子fp1,fp2,一次拿出1024个东西看一下,同时将他放到第二个箱子fp2里,至到箱子的东西完全拿出来,然后关闭两个箱子.

例子都是差不多的,你看看stdlib中f还头的函数就可以了,但是在C中文件操作就是这样的:
FILL *pf; //声明指针,当然也可以是指针数组 FILE pf[2] 或 FILE **pf;

pf =fopen();
fread() or fwrite() ... ... //操作文件
fclose(pf) //关闭文件追问

只是读取一个文件,怎么要定义两个指针?

main()
{
FILL *pf;
char abc[1024];
pf=fopen("D:\\a.txt","r");
fread(abc,strlen(abc),pf);
puts(abc);
fclose(pf);
}
这个哪里错了?

追答

fread(abc,strlen(abc),pf);
abc数组只是声明了,但其并没有初始化,C语言默认是不进行初始化的所以strlen(abc)的返回值是不确定的,你可以直接改成
main()
{
FILL *pf;
char abc[1024];
pf=fopen("D:\\a.txt","r");
fread(abc,1023,pf);
abc[1024]="\0";
puts(abc);
fclose(pf);
}

追问

编译有错

追答

#include

main()
{
FILE *pf;
char abc[1024];
pf=fopen("D:\\a.txt","r");
fread(abc,1023,1,pf);
abc[1024]="\0";
puts(abc);
fclose(pf);
}

追问

还是有错

追答

什么错误啊?我在gcc上编译了一下,有一个警告,不用管他

#include

main()
{
FILE *pf;
char abc[1024];
pf=fopen("D:\\a.txt","r");
fread(abc,1023,1,pf);
abc[1024]='\0';/////////
puts(abc);
fclose(pf);
}

追问

不是用VC6.0吗?

main()
{
FILE *pf;

pf=fopen("D:\\a.txt","r");
char abc[10];
fread(abc,10,1,pf);

puts(abc);
fclose(pf);
return 0;
}
这个运行成功,但是输出的应该是aaaaaaaaa,因为a.txt的内容是aaaaaaaaa,但是输出的却是aaaaaaaaaa后面还有些乱码?

追答

main()
{
FILE *pf;
int count;

pf=fopen("D:\\a.txt","r");
char abc[10];
count = fread(abc,10,1,pf);
abc[count]='\0';
puts(abc);
fclose(pf);
return 0;
}
后面的乱码是因为abc数组没有初始化,而puts函数是看到'\0'才停止的,加上就好了

追问

只输出一个a?

追答

main()
{
FILE *pf;
int count;

pf=fopen("D:\\a.txt","r");
char abc[10];
count = fread(abc,1,10,pf);//
abc[count]='\0';
puts(abc);
fclose(pf);
return 0;
}

追问

为什么把fread换成fwrite不行?count = fwrite(abc,1,10,pf);

1和10分别指的是什么?

char abc[10]='\0';可以这样赋值吗?
;

追答

函数原型
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
功 能
从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功返回 0。
参 数
buffer

用于接收数据的内存地址,大小至少是size*count字节.

size

单个元素的大小,单位是字节

count

元素的个数,每个元素是size字节.

stream

输入流
返回值
实际读取的元素个数.如果返回值与count不相同,则可能文件结尾或发生错误.

从ferror和feof获取错误信息或检测是否到达文件结尾.

不可以的,应该是 count = fread(abc,sizeof(char),10,pf);

本回答被提问者采纳
相似回答