以下是一个使用fopen()、fwrite()、fread()、fscanf()、fprintf()、feof()、fseek()函数操作一个文档的示例代码:```c
#include <stdio.h>
int main() {
FILE *fp;
char buffer[100];
int num;
float fnum;
// 打开文件
fp = fopen("test.txt", "w+");
if (fp == NULL) {
printf("Failed to open file.\n");
return 1;
}
// 写入数据
fprintf(fp, "Hello, world!\n");
num = 12345;
fwrite(&num, sizeof(int), 1, fp);
fnum = 3.14159;
fwrite(&fnum, sizeof(float), 1, fp);
// 移动文件指针到文件开头
fseek(fp, 0, SEEK_SET);
// 读取数据
fgets(buffer, 100, fp);
printf("%s", buffer);
fread(&num, sizeof(int), 1, fp);
printf("%d\n", num);
fread(&fnum, sizeof(float), 1, fp);
printf("%f\n", fnum);
// 关闭文件
fclose(fp);
return 0;
}
在上面的例子中,我们打开了一个名为"test.txt"的文件,并使用feof()函数在while循环中检查文件指针是否已经到达文件末尾。如果文件指针没有到达文件末尾,我们就使用fgetc()函数读取一个字符并输出它。最后,我们关闭了文件并返回0。
```
代码中使用了以下函数:
1. `fopen()`函数:
打开文件,返回文件指针。第一个参数为文件名,第二个参数为打开方式。打开方式可以是"w+"(读写模式,如果文件不存在则创建文件)或"r+"(读写模式,如果文件不存在则打开失败)等。注意,如果打开文件失败,返回值为NULL。
2. `fwrite()`函数:
向文件写入数据。第一个参数为要写入的数据的指针,第二个参数为每个数据的大小,第三个参数为要写入的数据个数,第四个参数为文件指针。注意,写入的数据类型和大小必须与函数参数对应,否则可能会导致数据写入错误。
3. `fread()`函数:
从文件读取数据。第一个参数为要读取的数据的指针,第二个参数为每个数据的大小,第三个参数为要读取的数据个数,第四个参数为文件指针。注意,读取的数据类型和大小必须与函数参数对应,否则可能会导致数据读取错误。
4. `fprintf()`函数:
向文件写入格式化数据。第一个参数为文件指针,第二个参数为格式化字符串,后面的参数为要写入的数据。注意,写入的数据类型和格式化字符串中的格式符必须对应,否则可能会导致数据写入错误。
5. `fscanf()`函数:
从文件读取格式化数据。第一个参数为文件指针,第二个参数为格式化字符串,后面的参数为要读取的数据的指针。注意,读取的数据类型和格式化字符串中的格式符必须对应,否则可能会导致数据读取错误。
6. `feof()`函数:
判断文件指针是否已到达文件末尾。如果已到达文件末尾,返回非0值;否则返回0。
7. `fseek()`函数:
移动文件指针。第一个参数为文件指针,第二个参数为偏移量,第三个参数为起始位置。起始位置可以是SEEK_SET(文件开头)、SEEK_CUR(当前位置)或SEEK_END(文件末尾)。注意,如果移动文件指针失败,可能会导致读写文件出错。
8.feof()函数
feof()函数用于检查文件指针是否已经到达文件末尾。下面是一个使用feof()函数的例子:```c
#include <stdio.h>
int main() {
FILE *fp;
char c;
fp = fopen("test.txt", "r");
if (fp == NULL) {
printf("Error: Unable to open file.\n");
return 1;
}
while (!feof(fp)) {
c = fgetc(fp);
putchar(c);
}
fclose(fp);
return 0;
}
```
9.C 库函数 char *fgets(char *str, int n, FILE *stream)
从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
参数
str -- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
返回值
如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。
如果发生错误,返回一个空指针。
实例
#include <stdio.h>
int main()
{
FILE *fp;
char str[60];
/* 打开用于读取的文件 */
fp = fopen("file.txt" , "r");
if(fp == NULL) {
perror("打开文件时发生错误");
return(-1);
}
if( fgets (str, 60, fp)!=NULL ) {
/* 向标准输出 stdout 写入内容 */
puts(str);
}
fclose(fp);
return(0);
}
10. int fputs(const char *str, FILE *stream)
C 库函数 int fputs(const char *str, FILE *stream) 把字符串写入到指定的流 stream 中,但不包括空字符。
参数
- str -- 这是一个数组,包含了要写入的以空字符终止的字符序列。
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。
返回值
该函数返回一个非负值,如果发生错误则返回 EOF。
实例
下面的实例演示了 fputs() 函数的用法。
#include <stdio.h>
int main ()
{
FILE *fp;
fp = fopen("file.txt", "w+");
fputs("这是 C 语言。", fp);
fputs("这是一种系统程序设计语言。", fp);
fclose(fp);
return(0);
}
需要注意的是,操作文件时要确保文件存在且对文件有足够的访问权限,否则可能会导致打开文件失败或读写文件出错。另外,在使用fwrite()和fread()函数时,要注意字节序的问题,否则可能会导致数据读取错误。
练习实例:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
int main()
{
FILE* fp;
int num = 3;
double dnum = 3.1415926;
//malloc函数返回void*指针,参数只有一个
void* a = malloc(sizeof(char)*255);
//memset按字节初始化a为0
memset(a,0,255);
fp = fopen("note.txt", "a+");
if(fp == NULL)
{
fprintf(stderr, "open file error\n");
printf("%s\n", strerror(errno));
}
/* fprintf(fp, "hello world3\n");
rewind(fp);
//fseek(fp, 6, SEEK_SET);
// fp = fopen("note.txt", "r+");
// %[^\n]遇到非换行符的字符输出
fscanf(fp, "%[^\n]", a);
printf("%s\n", a); */
//将文件指针放在首位,还有SEEK_CUR/SEEK_END
fseek(fp, 0, SEEK_SET);
fwrite(&num, sizeof(int), 1, fp);
fseek(fp, 0, SEEK_END);
fwrite(&dnum, sizeof(double), 1, fp);
//重置文件指针
rewind(fp);
fread(a, sizeof(int), 1, fp);
printf("%d,%d\n", sizeof(num), sizeof(dnum));
printf("%d\n", *((int*)a));
//文件指针相对初始位置往后偏移4位,成功返回0,失败返回负一
fseek(fp, 4, SEEK_SET);
fread(a, sizeof(double), 1, fp);
printf("%lf\n", *((double*)a));
free(a);
fclose(fp);
}