本篇文章,简单看看fopen、fread、fwrite、fseek、fclose、fgetc、fputc、feof的用法。
fopen
和 open
都是用于打开文件的函数,但它们有几个主要的区别:
参考:总结open与fopen的区别 - NickyYe - 博客园 (cnblogs.com)
-
用法和参数:
fopen
是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。它的原型为FILE *fopen(const char *filename, const char *mode);
,接受文件名和打开模式作为参数。open
是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引。它的原型为int open(const char *pathname, int flags, mode_t mode);
,接受文件路径、打开标志和文件权限作为参数。
`fopen`是C标准函数,因此拥有良好的移植性;而`open`是UNIX系统调用,移植性有限。
-
返回值:
fopen
返回一个指向FILE
结构的指针,表示打开的文件流。如果打开文件失败,则返回NULL
。open
返回一个整数文件描述符,表示打开的文件。如果打开文件失败,则返回 -1。
-
使用场景:
fopen
通常用于 C 语言中,特别是在需要进行文件输入输出时。open
更多地用于 Unix-like 系统中,特别是在系统级编程中,如系统调用或在 C 语言中直接调用 POSIX API。
-
功能:
fopen
提供了更高级的文件操作功能,如读写文件、格式化输入输出等。open
是更低级的接口,主要用于打开文件和获取文件描述符,而不提供像fopen
那样的高级文件操作功能。
总的来说,如果你只需要简单地打开文件并进行读写操作,使用 fopen
更加方便。但如果你需要更底层的文件操作或与系统级别的 API 交互,那么使用 open
更为合适。
下面演示标准C库打开创建文件:
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
FILE *fp;;
char *str = "lanzhao handsome";
char readBuf[128] = {0};
fp = fopen("./zhao.txt", "w+"); //w+ 表示创建一个可读可写的新文件
fwrite(str, sizeof(char)*strlen(str), 1, fp);
//第二个参数表示一次性写多少个,第三个参数表示写几次
fseek(fp, 0, SEEK_SET); // 移动光标位置到开头
fread(readBuf, sizeof(char)*strlen(str), 1, fp);
//第二个参数表示一次性读多少个,第三个参数表示读几次
//也可以写成下面这种形式:表示一次性读sizeof(char)个,读strlen(str)次
//fread(readBuf, sizeof(char),strlen(str), fp);
printf("read data: %s\n", readBuf);
fclose(fp);
return 0;
}
运行结果如下图所示:
grep "struct Test" *
这个命令是一个常用的命令行工具 grep
的使用示例,用于在当前目录下的所有文件中查找包含字符串 "struct Test" 的行。
具体地说,命令的各个部分的含义如下:
-
grep
: 是一个用于搜索文本的命令行工具,在 Linux 和类 Unix 系统中常用。它可以在文件中搜索指定的字符串模式,并将包含该模式的行输出到标准输出。 -
"struct Test"
: 是要搜索的字符串模式,即要查找的内容。在这个例子中,它是一个包含在双引号中的字符串,表示要查找的内容是 "struct Test" 这个字符串。grep
将会搜索文件中是否包含该字符串。 -
*
: 是一个通配符,用于匹配当前目录下的所有文件。它会被展开成当前目录下的所有文件名,并作为grep
命令的参数,告诉grep
在这些文件中搜索指定的字符串模式。
因此,整个命令的意思是,在当前目录下的所有文件中,搜索包含字符串 "struct Test" 的行,并将这些行输出到标准输出。
下面展示读写结构体:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
struct Test{
int a;
char b;
};
int main(int argc, char **argv)
{
FILE *fp;
struct Test data = {100, 'a'};
struct Test data2;
fp = fopen("./file1", "w+");
int n_write = fwrite(&data, sizeof(struct Test), 1, fp);
printf("n_write = %d\n", n_write);
fseek(fp, 0, SEEK_SET);
int n_read = fread(&data2, sizeof(struct Test), 1, fp);
printf("n_read = %d\n", n_read);
printf("read %d, %c\n", data2.a, data2.b);
fclose(fp);
return 0;
}
下面展示fputc,用于将一个字符写入到指定的文件流中的用法:
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
int i;
char *str = "lanzhao handsome!";
int len = strlen(str);
fp = fopen("./text.txt", "w+");
for(i = 0; i < len; i++){
fputc(*str,fp);
str++;
}
fclose(fp);
return 0;
}
运行结果如下,把字符串一个一个字符的放到text.txt中。
下面展示fgetc和feof , fgetc用于从指定的文件流中读取一个字符,一个一个读出来。feof
用于检查文件流的结束标志,检查是否已经读到文件的尾巴。
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char c;
fp = fopen("./text.txt", "r"); // 以只读的方式打开文件
while(!feof(fp)){ //feof在没有到达文件末尾时,返回0。到达末尾后返回非零值
c = fgetc(fp); //从fp文件流中获得1个字符
printf("%c", c);//打印出获得的字符
}
fclose(fp);
return 0;
}
Linux文件编程到此结束......