贡献者: addis
FILE *fopen(const char *filename, const char *mode);
创建新文件,读取失败返回 NULL
。
int fgetc(FILE *stream)
读取一个字符
int fgets(FILE *stream)
读取一个字符
fscanf, fgets
读取文件
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
把字符串写入文件
fprintf
写文件(具有类似 printf
的格式化)
fseek(file, start_ind, SEEK_SET)
把文件指针移动到文件的某个位置。
long ftell(FILE *stream)
获取文件指针
int fclose(FILE *stream)
关闭文件(成功返回 0,否则返回 EOF)
fopen()
模式如下:
"r"
: 只读 (文件必须存在).
"w"
: 只写 (新建或覆盖文件).
"a"
: 最后写 (不存在则新建).
"r+"
: 读写 (文件必须存在).
"w+"
: 读写 (新建或覆盖文件).
"a+"
: 最后写和读 (不存在则新建).
b
,意思是二进制文件,对 Linux 没有任何作用,对 Windows,如果不加,写入 \n
时实际上写入的是 \r\n
。
r+
模式的例子:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
char *buffer;
// start index (will start from the 6th char)
int start_ind = 5;
// Length of the string to read
int length = 10;
// Open the file in read mode
file = fopen("example.txt", "r+");
if (file == NULL) {
perror("Error opening file");
return 1;
}
// Allocate memory for the string
buffer = (char *)malloc((length + 1) * sizeof(char));
if (buffer == NULL) {
perror("Memory allocation error");
fclose(file);
return 1;
}
// Move the file pointer to the start index
fseek(file, start_ind, SEEK_SET);
// Read the bytes from start_ind
size_t bytesRead = fread(buffer, sizeof(char), length, file);
// Null-terminate the buffer if any data was read
if (bytesRead > 0)
buffer[bytesRead] = '\0';
if (bytesRead != length) {
// Check if we reached EOF
if (feof(file))
printf("End of file reached.\n");
// Check for read errors
else if (ferror(file))
perror("Error reading file");
}
// Print the string
printf("Read string: %s\n", buffer);
// Write to middle of file
fseek(file, start_ind, SEEK_SET);
size_t bytesWritten = fwrite("abcde", sizeof(char), 5, file);
// Free the allocated memory and close the file
free(buffer);
fclose(file);
return 0;
}
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
读取指定 size*nmemb
字节的内容到 ptr
(不会在结尾写 \0
!需要手动添加)。函数返回成功读取的元素个数,如果返回值小于 nmemb
,说明达到了文件末尾,或发生了错误。读完后,当前位置会指向下一个未读的字符。
char *fgets(char *str, int n, FILE *stream)
是 fread()
的简化版,仅读取文件的一行。对 str
写入 \0
结尾的字符串,返回其指针。如果错误则返回 NULL
。
int puts(const char *str)
把字符串输出到 stdout
,并自动添在最后加一个 \n
。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
w+
模式的例子:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
// Open the file in "w+" mode
// (write and read, truncate if exists)
file = fopen("example.txt", "wb+");
if (file == NULL) {
printf("Error opening file!\n");
return 1;
}
// Step 1: Write to the file
fputs("Hello, World!\n", file);
fputs("This is a test file.\n", file);
fputs("End of writing.\n", file);
// Step 2: Jump to the beginning of the file using fseek()
fseek(file, 0, SEEK_SET);
// Step 3: Read from the file and print its
// contents to the console
char buffer[100];
printf("Reading the file contents:\n");
while (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("%s", buffer);
}
// Step 4: Move the file pointer to a specific location, modify contents
fseek(file, 7, SEEK_SET); // Jump to the 8th character
fputs("Universe", file); // Overwrite "World" with "Universe"
// Step 5: Jump to the beginning again to read the updated content
fseek(file, 0, SEEK_SET);
printf("\nUpdated file contents:\n");
while (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("%s", buffer);
}
// Close the file
fclose(file);
return 0;
}
int fseek(FILE *stream, long offset, int whence);
可以跳到文件的某个位置。例如 fseek(file, 7, SEEK_SET);
相对于文件开头,fseek(file, -7, SEEK_CUR);
相对当前位置,SEEK_END
相对于文件 EOF。如果成功,fseek()
返回 0。如果返回非 0 则失败(例如超出范围)。
fseek(file, -3, SEEK_END)
然后 fgetc(file)
三次即可。
// Move the file pointer to the end of the file
fseek(file, 0, SEEK_END);
// Data to be appended
const char *text = "This is appended text.\\n";
// Write the data to the file (append it at the end)
fwrite(text, sizeof(char), strlen(text), file);
offset
可以叫做文件位置指示器 file position indicator,也称为文件指针,但 FILE *
也叫做文件指针(为了区分应该叫做文件流指针 file stream pointer),需要根据语境区分!
void perror(const char *str)
打印错误信息到 stderr
并根据全局变量 errno
在后面附上 : 具体错误原因(如文件不存在,权限不够)
。
int fgetc(file)
获取一个字节。如果因为超出文件结尾没有获取到,则返回 EOF。
EOF
是 stdio.h
中的一个宏,通常是 -1 但不能保证。
long ftell(FILE *stream)
可以查看当前位置,会返回 fseek(file, 位置, SEEK_SET)
设置的位置。
FILE *
都有两个指示器:End-of-File (EOF) Indicator 和 Error Indicator。分别由 int feof(FILE *)
和 int ferror(FILE *)
检查,如果没有则返回 0。
clearerr(FILE *)
把两个指示器都重置为正常。
rewind(FILE *)
相当于 clearerr(file)
和 fseek(file, 0, SEEK_SET);