在C语言中,文件调用是非常重要的一个部分,它允许我们读取和写入磁盘上的文件,通过文件调用,我们可以实现数据的持久化存储,以及在不同程序之间传递数据,本文将详细介绍C语言中文件调用的基本概念、操作流程以及一些常用的函数。
基本概念
1、文件指针:在C语言中,文件指针是一个指向FILE类型的指针,用于标识一个打开的文件,当我们打开一个文件时,系统会为这个文件分配一个FILE结构体,并将文件指针指向这个结构体。
2、文件类型:C语言中有两种文件类型,分别是文本文件和二进制文件,文本文件是指以字符为单位进行读写的文件,每个字符占一个字节;二进制文件是指以字节为单位进行读写的文件,可以读写任意类型的数据。
3、文件模式:C语言中有三种文件模式,分别是只读模式(’r’)、只写模式(’w’)和读写模式(’a’),只读模式表示只能读取文件内容,不能写入;只写模式表示只能写入文件内容,不能读取;读写模式表示既可以读取文件内容,也可以写入文件内容。
操作流程
C语言中文件调用的基本操作流程如下:
1、打开文件:使用fopen()函数打开一个文件,并返回一个文件指针,如果打开成功,fopen()函数返回非空指针;如果打开失败,fopen()函数返回NULL。
2、读写文件:使用fread()、fwrite()等函数对文件进行读写操作。
3、关闭文件:使用fclose()函数关闭一个已经打开的文件,关闭文件后,不能再对这个文件进行读写操作。
常用函数
1、fopen()函数:用于打开一个文件,其原型为:FILE *fopen(const char *filename, const char *mode);
参数说明:
filename:要打开的文件名,可以是相对路径或绝对路径。
mode:打开文件的模式,如”r”、”w”、”a”等。
返回值:成功打开文件时,返回一个非空的文件指针;失败时,返回NULL。
示例代码:
#include <stdio.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { printf("Failed to open file. "); return 1; } // 对文件进行读写操作... fclose(file); // 关闭文件 return 0; }
2、fclose()函数:用于关闭一个已经打开的文件,其原型为:int fclose(FILE *stream);
参数说明:
stream:要关闭的文件指针。
返回值:成功关闭文件时,返回0;失败时,返回EOF(通常是1)。
示例代码:
#include <stdio.h> int main() { FILE *file = fopen("example.txt", "r"); if (file == NULL) { printf("Failed to open file. "); return 1; } // 对文件进行读写操作... if (fclose(file) != 0) { printf("Failed to close file. "); return 1; } return 0; }
3、fread()函数:用于从文件中读取数据,其原型为:size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
参数说明:
ptr:指向要存储数据的缓冲区的指针。
size:每个数据项的大小,以字节为单位。
count:要读取的数据项个数。
stream:要读取数据的文件指针。
返回值:实际读取的数据项个数,如果到达文件末尾或发生错误,返回值可能小于count。
示例代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> // for read() function in Windows APIs (not needed in Linux/Mac) #ifdef _WIN32 // Windows specific code block: use the Win32 API function ReadFile() instead of fread() and fwrite() for reading and writing files. This is necessary because fread() and fwrite() are not standard C library functions on Windows. They are part of the C11 standard, but not all C compilers support them yet. The Win32 API function ReadFile() is similar to fread(), but it can also read data from a file that was opened with the "binary" or "text" mode, not just the "text" mode. Here is how you can use it: #define BUFSIZE 4096 int main() { HANDLE hFile; DWORD bytesRead; char buffer[BUFSIZE]; // Open the file in binary mode: hFile = CreateFile("example.bin", //GENERIC_READ, // GENERIC_WRITE, // 0, NULL, //OPEN_EXISTING, //FILE_ATTRIBUTE_NORMAL, NULL); // Read data from the file into the buffer: bytesRead = ReadFile(hFile, buffer, sizeof(buffer), NULL, NULL); if (bytesRead > 0) { // Process the data in the buffer... } else { // Error occurred: display an error message and exit the program. printf("Error %lu: %s when reading from file! GLE=", GetLastError(), strerror(GetLastError())); return 1; } // Close the file handle: CloseHandle(hFile); return 0; } #else // Unixlike systems specific code block: use fread() and fwrite() for reading and writing files. int main() { FILE *file = fopen("example.bin", "rb"); if (file == NULL) { perror("Failed to open file"); return 1; } // Read data from the file into the buffer: size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer), file); if (bytesRead > 0) { // Process the data in the buffer... } else { // Error occurred: display an error message and exit the program. perror("Error reading from file"); return 1; } // Close the file handle: fclose(file); return 0; } #endif void printBufferContents(const char *buffer) { for (size_t i = 0; i < strlen(buffer); i++) { printf("%c", buffer[i]); } } int main() { char buffer[BUFSIZE]; memset(buffer, 0, sizeof(buffer)); // Read data from the file into the buffer: size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer), stdin); if (bytesRead > 0) { // Process the data in the buffer... printBufferContents(buffer); } else { // Error occurred: display an error message and exit the program. perror("Error reading from file"); return 1; } return 0; } #endif // End of preprocessor directives (ifdef/ifndef). Note that this code block only works on Unixlike systems (Linux/macOS) and not on Windows. It uses the fread() function to read data from a file into a buffer, and then processes the data in the buffer using a custom printBufferContents() function that prints each character in the buffer on a new line. If an error occurs while reading from the file, it displays an error message and exits with a nonzero status code. If no error occurs, it prints the contents of the buffer and exits successfully with a zero status code.
评论(0)