当前位置:网站首页>[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); //b2、 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 .
边栏推荐
- Clion console output Chinese garbled code
- awk从入门到入土(5)简单条件匹配
- FOC control
- C语言-入门-基础-语法-[标识符,关键字,分号,空格,注释,输入和输出](三)
- Xcode 6 swift code completion does not work properly - Xcode 6 swift code completion not working
- How to re enable local connection when the network of laptop is disabled
- How to solve the problem of computer jam and slow down
- L1 regularization and L2 regularization
- Cancel ctrl+alt+delete when starting up
- Openfeign service interface call
猜你喜欢

DM8 command line installation and database creation

Awk from entry to earth (12) awk can also write scripts to replace the shell

微服务入门:Gateway网关

CLion-控制台输出中文乱码

Codeforces Round #750 (Div. 2)(A,B,C,D,F1)

Clion console output Chinese garbled code

Codeforces Round #803 (Div. 2)(A-D)

Codeforces Round #803 (Div. 2)(A-D)

【无标题】转发最小二乘法

Codeforces Round #793 (Div. 2)(A-D)
随机推荐
Basic discipline formula and unit conversion
Codeforces Round #750 (Div. 2)(A,B,C,D,F1)
C语言-入门-基础-语法-[变量,常亮,作用域](五)
Codeforces Global Round 21(A-E)
C # implements a queue in which everything can be sorted
@Role of requestparam annotation
Talk about single case mode
[Chongqing Guangdong education] National Open University spring 2019 455 logistics practice reference questions
C语言-入门-基础-语法-[运算符,类型转换](六)
std::is_ union,std::is_ class,std::integral_ constant
ctfshow web255 web 256 web257
Awk from getting started to digging in (4) user defined variables
snipaste 方便的截图软件,可以复制在屏幕上
2022 tower crane driver examination and tower crane driver examination questions and analysis
Codeforces Global Round 21(A-E)
How to play dapr without kubernetes?
Codeforces Round #793 (Div. 2)(A-D)
Research Report on research and investment prospects of China's testing machine industry (2022 Edition)
How to choose solid state hard disk and mechanical hard disk in computer
Relationship and operation of random events










