当前位置:网站首页>[C Advanced] file operation (2)
[C Advanced] file operation (2)
2022-07-04 08:51:00 【Three points of bitterness】
Catalog
1、 Random reading and writing of documents
3、 Determination of the end of file reading
1、 Random reading and writing of documents
(1)fseek
Create a file test.txt, There is... In it abcdef Such a string , We were reading the document before , The initial file pointer is to a Of , Read a character pointing to b, Read another point c…… At this time, it is read in sequence , This is the sequential reading and writing of files . Let's review :
#include<stdio.h> int main() { // Open file FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } // Read the file int ch = fgetc(pf); printf("%c\n", ch); //a ch = fgetc(pf); printf("%c\n", ch); //b ch = fgetc(pf); printf("%c\n", ch); //c // Close file fclose(pf); pf = NULL; return 0; }
Can we read in the way we want , For example, read directly d, At this point, a function of file pointer positioning is involved :fseek
- fseek: Move a file pointer to a specific location
Locate the file pointer according to its position and offset .
int fseek ( FILE * stream, long int offset, int origin );
- Understand the three parameters :
- stream: For which stream
- offset: Offset
- origin: The starting position
- There are three options for starting position :
- SEEK_CUR:
1、 Shift the file forward from its current location 1 Bytes :
// Read the file int ch = fgetc(pf); printf("%c\n", ch); //a // Adjust file pointer fseek(pf, -1, SEEK_CUR); ch = fgetc(pf); printf("%c\n", ch); //a ch = fgetc(pf); printf("%c\n", ch); //b
2、 Let files from The current position Offset backward 2 Bytes :
// Read the file int ch = fgetc(pf); printf("%c\n", ch); //a // Adjust file pointer fseek(pf, 2, SEEK_CUR); ch = fgetc(pf); printf("%c\n", ch); //d ch = fgetc(pf); printf("%c\n", ch); //e
- SEEK_END:
From file At the end of Start to shift forward 2 byte
// Read the file int ch = fgetc(pf); printf("%c\n", ch); //a // Adjust file pointer fseek(pf, -2, SEEK_END); ch = fgetc(pf); printf("%c\n", ch); //e ch = fgetc(pf); printf("%c\n", ch); //f
- SEEK_SET:
From file The starting position Start to shift back 3 byte
// Read the file int ch = fgetc(pf); printf("%c\n", ch); //a // Adjust file pointer fseek(pf, 3, SEEK_SET); ch = fgetc(pf); printf("%c\n", ch); //d ch = fgetc(pf); printf("%c\n", ch); //e
(2)ftell
Returns the offset of the file pointer from its starting position
long int ftell ( FILE * stream );
- for example :
// Read the file int ch = fgetc(pf); printf("%c\n", ch); //a // Adjust file pointer fseek(pf, 3, SEEK_SET); ch = fgetc(pf); printf("%c\n", ch); //d int ret = ftell(pf); printf("%d\n", ret);//4
(3)rewind
Return the file pointer to the beginning of the file
void rewind ( FILE * stream );
- for example :
// Read the file int ch = fgetc(pf); printf("%c\n", ch); //a // Adjust file pointer fseek(pf, -1, SEEK_END); ch = fgetc(pf); printf("%c\n", ch); //f // Return the file to its starting position rewind(pf); ch = getc(pf); printf("%c\n", ch); //a
2、 Text files and binaries
According to the organization of data , Data files are called text file perhaps Binary .
Data is stored in memory in binary form , If the output without conversion is to external memory , Namely Binary .
If it's required to use ASCII In the form of code , You need to convert before storing . With ASCII The file stored in the form of characters is text file .
- How is a data stored in memory ?
All characters are written in ASCII stored , Numerical data can be used either ASCII stored , It can also be stored in binary form .
If there are integers 10000, If the ASCII Code output to disk , The disk is occupied by 5 Bytes ( One byte per character ), And binary output , On the disk 4 Bytes (VS2013 test ).
- test :( Store in binary form )
#include <stdio.h> int main() { int a = 10000; FILE* pf = fopen("test.txt", "wb"); if (pf == NULL) { perror("fopen"); return 1; } fwrite(&a, sizeof(int), 1, pf);// The binary form is written to the file fclose(pf); pf = NULL; return 0; }
We put test.txt Put the contents of the document in VS2022 Look inside the compiler :
- 10000 Binary system :0000 0000 0000 0000 0010 0111 0001 0000
- Convert it to hexadecimal :00 00 27 10
3、 Determination of the end of file reading
(1) Misused feof
Keep in mind : During file reading , Out-of-service feof The return value of the function is directly used to determine whether the end of the file .
feof It is applied when the file reading ends , The judgment is that the read failed and ended , Or end of file .
1. Whether the reading of text file is finished , Determine whether the return value is EOF ( fgetc ), perhaps NULL ( fgets )
- for example :
- fgetc Judge whether it is EOF .
- fgets Determine whether the return value is NULL .
2. Judgment of reading end of binary file , Judge whether the return value is less than the actual number to be read .
- for example :
fread Judge whether the return value is less than the actual number to be read .
- Example :
Suppose we put a piece of code in test.txt In file
Now write the code test.txt A copy of the document , Generate test2.txt file
#include<stdio.h> int main() { FILE* pfread = fopen("test.txt", "r"); if (pfread == NULL) { return 1; } FILE* pfwrite = fopen("test2.txt", "w"); if (pfwrite == NULL) { fclose(pfread); return 1; } // File opened successfully // Read and write files int ch = 0; while ((ch = fgetc(pfread)) != EOF) { // Writing documents fputc(ch, pfwrite); } // Judge why it ended if (feof(pfread)) { printf(" End of file flag encountered , The file ends normally \n"); } else if (ferror(pfread)) { printf(" File read failed end \n"); } // Close file fclose(pfread); pfread = NULL; fclose(pfwrite); pfwrite = NULL; return 0; }
And test.txt The contents of the document are exactly the same
4、 File buffer
It means that the system automatically opens up a block in memory for each file being used in the program “ File buffer ”. Data output from memory to disk is first sent to a buffer in memory , After the buffer is filled, it is sent to the disk together . If you read data from disk to computer , Then read the data from the disk file and input it into the memory buffer ( Fill the buffer ), And then send the data from the buffer to the program data area one by one ( Program variables, etc ). The size of the buffer depends on C The compiler system decides .
- Purpose : Improve the efficiency of the operating system .
- Example :
#include <stdio.h> #include <windows.h> int main() { FILE* pf = fopen("test.txt", "w"); fputs("abcdef", pf);// Put the code in the output buffer first printf(" sleep 10 second - The data has been written , open test.txt file , Found no content in the file \n"); Sleep(10000); printf(" Refresh buffer \n"); fflush(pf);// When the buffer is flushed , Write the data in the output buffer to a file ( disk ) // notes :fflush In high version VS It can't be used on printf(" Sleep again 10 second - here , Open again test.txt file , There's something in the file \n"); Sleep(10000); fclose(pf); // notes :fclose When closing a file , It also flushes the buffer pf = NULL; return 0; }
- Conclusion :
Because there is a buffer ,C Language when operating files , You need to flush the buffer or close the file at the end of the file operation . If you don't do , May cause problems in reading and writing files .
边栏推荐
- Newh3c - routing protocol (RIP, OSPF)
- Flutter 集成 amap_flutter_location
- Cancel ctrl+alt+delete when starting up
- AI Winter Olympics | is the future coming? Enter the entrance of the meta universe - virtual digital human
- 没有Kubernetes怎么玩Dapr?
- 地平线 旭日X3 PI (一)首次开机细节
- Four essential material websites for we media people to help you easily create popular models
- What sparks can applet container technology collide with IOT
- How to solve the problem of computer jam and slow down
- Relationship and operation of random events
猜你喜欢
DM8 command line installation and database creation
到底什么才是DaaS数据即服务?别再被其他DaaS概念给误导了
Newh3c - routing protocol (RIP, OSPF)
Turn: excellent managers focus not on mistakes, but on advantages
微服务入门:Gateway网关
保姆级JDEC增删改查练习
What exactly is DAAS data as a service? Don't be misled by other DAAS concepts
微服務入門:Gateway網關
FOC control
埃氏筛+欧拉筛+区间筛
随机推荐
Awk from entry to penetration (6) regular matching
Educational Codeforces Round 119 (Rated for Div. 2)
1211 or chicken and rabbit in the same cage
The old-fashioned synchronized lock optimization will make it clear to you at once!
4 small ways to make your Tiktok video clearer
广和通高性能4G/5G无线模组解决方案全面推动高效、低碳智能电网
DM8 database recovery based on point in time
Call Baidu map to display the current position
Bishi blog (13) -- oral arithmetic test app
微服務入門:Gateway網關
LinkedList in the list set is stored in order
ArcGIS application (XXII) ArcMap loading lidar Las format data
What should I do if there is a problem with the graphics card screen on the computer
User login function: simple but difficult
C language - Introduction - Foundation - syntax - [main function, header file] (II)
Codeforces Round #803 (Div. 2)(A-D)
What sparks can applet container technology collide with IOT
Awk from getting started to digging in (4) user defined variables
From scratch, use Jenkins to build and publish pipeline pipeline project
C语言-入门-基础-语法-[主函数,头文件](二)