当前位置:网站首页>C language input / output stream and file operation
C language input / output stream and file operation
2022-07-01 16:43:00 【jie3606】
File operations
What is the file ?
File is a kind of data source , The main function is to save data .
In the operating system , In order to unify the operation of various hardware , Simplify the interface , Different hardware devices are also treated as one file . Operations on these files , Equivalent to the operation of ordinary files on disk . for example :
- The display is often referred to as a standard output file ,printf Is to output data to this file ;
- The keyboard is often referred to as a standard input file ,scanf Reading data from this file .
Files corresponding to common hardware devices
- stdin Standard input file , General keyboard ;scanf()、getchar() By default, functions such as stdin Get input .
- stdout Standard output file , Generally refers to the display ;printf()、putchar() And so on. By default stdout Output data .
- stderr Standard error file , Generally refers to the display ;perror() And so on. By default stderr Output data ( I'll talk about ).
- stdprn Standard print files , Generally refers to the printer .
We're not going to talk about how hardware devices are mapped to files , You just need to remember , stay C In language, hardware devices can be seen as files , Some I / O functions don't require you to specify which file to read or write , The system has set the default file for them , Of course, you can also change , For example, let printf Output data to a file on disk .
The correct flow of operating the file is : Open file --> Read and write files --> Close file . The file should be opened before reading and writing , Shut down after use .
Open a file , It's about getting information about the file , For example, file name 、 File status 、 Current reading and writing position, etc , This information will be saved in a FILE In the structure variable of type .
To close a file is to disconnect from it , Release structure variables , At the same time, it is forbidden to operate the file again .
stay C In language , There are many ways to read and write files , Can be read character by character , You can also read an entire line , You can also read several bytes . The reading and writing positions of files are also very flexible , Can be read from the beginning of the file , It can also be read from the middle .
What is flow ?
file ( Save on disk ) Only when it is loaded into memory can it be processed , The data in memory can only be saved to a file ( disk ) In order not to lose . During this period, we call the transfer of data from file to memory as file flow .
File is a kind of data source , Except for the documents , And databases 、 The Internet 、 Keyboard, etc , Data transferred to memory is saved to C Language variables ( For example, integers 、 character string 、 Array 、 Buffer, etc. ). We put data in data sources and programs ( Memory ) The process of passing between is called Data flow (Data Stream). Corresponding , Data from data source to program ( Memory ) The process is called Input stream (Input Stream), Slave program ( Memory ) The process of getting to the data source is called Output stream (Output Stream).
The difference between a text file and a binary file ?
( stay C In language ) According to the different storage forms of data in files, we put files and binary files .
- text file : Treat the data to be stored as a series of characters , Put the ASCII The code value is stored in the file . Every ASCII The code value takes up one byte (8bit) Each byte represents a character . Therefore, text files are also called character files or ASCII file , It's a character sequence file .
- Binary : Store the corresponding binary form of data in a file , It's a byte sequence file .

C Language file operation
Open and close files
Open file
stay C In language , You must open the file before operating it ; So-called “ Open file ”, Is the process of connecting programs and files .
After opening the file , The program can get the relevant information of the file , For example, size 、 type 、 jurisdiction 、 The creator 、 Update time, etc . In the subsequent process of reading and writing files , The program can also record which location is currently read and written , You can continue to operate on this basis next time .
FILE *fopen( const char *filename, const char *mode );(C99 front )
- filename - The file name associated with the file system
- mode - Open mode
- Return value FILE( Definition and stdio.h A structure type in will be discussed later ) Failed to open the file. Return NULL
File open mode 
call fopen() Function time Read and write permissions must be specified , But you can't specify how to read and write ( here The default is "t").
Read / write permissions and read / write methods can be used in combination , However, the read-write mode must be placed under the read-write permission middle perhaps The tail ( let me put it another way , You cannot put the read-write mode at the beginning of the read-write permission ). for example :
Put the read-write mode at the end of the read-write permission :“rb”、“wt”、“ab”、“r+b”、“w+t”、“a+t”
Put the read-write mode in the middle of the read-write permissions :“rb+”、“wt+”、“ab+”
As a whole , The file is opened by r、w、a、t、b、+ Six characters , What is the meaning of each character :
- r(read): read
- w(write): Write
- a(append): Additional
- t(text): text file
- b(binary): Binary
- +: Read and write
Close file
Once the files are used , Should use the fclose() Function to close the file , To release resources , Avoid data loss .fclose() The usage of is :
int fclose( FILE stream )
- stream - File streams that need to be closed
- Return value Success is 0 , Otherwise EOF .
Close the given file stream . Flush any unwritten buffer data to OS . Discard any unread buffer data . Whether the operation is successful or not , Streams are no longer associated with files . If in fclose Use pointer after returning stream The behavior is undefined .
Example
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define N 100
int main() {
FILE* fp;
char str[N + 1];
if ((fp = fopen("text.txt", "r")) == NULL) {
puts(" File opening failure ");
exit(0);
}
while (fgets(str,N,fp)!=NULL)
{
printf("%s", str);
}
fclose(fp);
return 0;
}
Reading and writing of documents
Read and write files in character form
int fgetc( FILE *stream );
- stream - Read the source of the character
- Return value Characters obtained when successful , On failure: EOF .
int fputc( int ch, FILE *stream );
- ch - The character to be written
- stream - Output stream
- Return value success , Returns the written character . When the failure , return EOF And set up stream Error indicator on ( see ferror() ).
Example
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define N 100
int main() {
FILE* fp;
char ch;
if ((fp = fopen("text.txt", "r+")) == NULL) {
puts(" File opening failure ");
exit(0);
}
while ((ch = fgetc(fp))!=EOF)
{
// Sleep(100);
putchar(ch);
}
while ((ch = getchar()) != '\n') {
fputc(ch, fp);
}
fclose(fp);
return 0;
}
Read and write files as strings
char *fgets ( char *str, int n, FILE *fp );
- str Is a character array
- n For the number of characters to read
- fp For file pointer .
- Return value : Return the first address of character array when reading successfully , That is to say str; Returns when the read fails NULL; If the internal pointer of the file has already pointed to the end of the file when reading begins , Then you won't be able to read any characters , Also returned NULL.
About fgets() A few caveats
- fgets() When it comes to line breaks , The newline character will be read into the current string . and gets() Dissimilarity , It ignores line breaks .
- The read string will be at the end Automatic addition ‘\0’,n One character also includes ‘\0’. in other words , Actually, it only reads n-1 Characters , If you want to read 100 Characters ,n The value of should be 101.
- need Key points Yes. , Reading into n-1 If it appears before characters Line break , Or read end of file , be End of read . That means , No matter n What is the value of ,fgets() Only one line of data can be read at most , You can't cross the line . stay C In language , There is no function to read files by line , We can With the help of fgets(), take n The value of is set large enough , One line of data can be read at a time .
int fputs( char *str, FILE *fp );
- str For the string to be written
- fp For file pointer
- Return value Write success, return non negative number , Failure to return EOF
Be careful :puts() Go to stdin Output with line feed
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define N 100
int main() {
FILE* fp;
char str[N+1];
if ((fp = fopen("text.txt", "r+")) == NULL) {
puts(" File opening failure ");
exit(0);
}
while (fgets(str,N,fp)!=NULL)
{
//Sleep(100);
printf("%s", str);
}
fclose(fp);
return 0;
}
Read files in binary mode
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );(C99 front )
size_t fread( void *restrict buffer, size_t size, size_t count,FILE *restrict stream );(C99 rise )
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );(C99 front )
size_t fwrite( const void *restrict buffer, size_t size, size_t count, FILE *restrict stream );(C99 rise )
- buffer Pointer to a memory block , It can be an array 、 Variable 、 Structure, etc .fread() Medium buffer Used to store the read data ,fwrite() Medium buffer Used to store the data to be written .
- size: Represents the number of bytes per data block .
- count: Indicates the number of data blocks to read and write .
- stream: Indicates the file pointer ( File stream ).
Return value : Returns the number of blocks successfully read and written ( Number of objects ), That is to say count. If the return value is less than count:
- about fwrite() Come on , There must be a write error , It can be used ferror() Function detection .
- about fread() Come on , May have read to the end of the file , An error may have occurred , It can be used ferror() or feof() testing .
- If an error occurs , Then the result value of the file position indicator of the stream is uncertain . If you read in some elements , Then the element value is uncertain .
Example
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
enum {
SIZE = 5 };
int main(void)
{
int a[SIZE] = {
1, 2, 3, 4, 5 };
FILE* fp1 = fopen("text.txt", "wb");
assert(fp1);
int tem = fwrite(a, sizeof(a[0]), SIZE, fp1);
printf(" Will succeed %d Write data to file \n", tem);
fclose(fp1);
int b[SIZE];
FILE* fp2 = fopen("text.txt", "rb");
assert(fp2);
tem = fread(b, sizeof b[0], SIZE, fp2);
fclose(fp2);
printf(" Successfully read in %d Data \n", tem);
for (int i = 0; i < SIZE; i++) {
printf("%d ", b[i]);
}
return 0;
}
Format read-write file
int fscanf ( FILE *fp, char * format, … );
int fprintf ( FILE *fp, char * format, … );
- fp For file pointer
- format Control string for format
- … Represents a list of parameters
- Return value fprintf() Returns the number of characters successfully written , If it fails, it returns a negative number .
- Return value fscanf() Returns the number of successfully assigned parameters in the parameter list .
And scanf() and printf() comparison , They only have one more fp Parameters .
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define N 2
struct stu {
char name[10];
int num;
int age;
float score;
} boya[N], boyb[N], * pa, * pb;
int main() {
FILE* fp;
fp = fopen("test.txt", "wt+");
assert(fp);
pa = boya;
for (int i = 0; i < N; i++) {
scanf("%s %d %d %f", pa->name, &(pa->num), &(pa->age), &(pa->score));
pa++;
}
pa = boya;
for (int i = 0; i < N; i++) {
fprintf(fp, "%s %d %d %f\n", pa->name, pa->num, pa->age, pa->score);
pa++;
}
rewind(fp);// Move the file position indicator to the beginning of a given file stream .
pb = boyb;
for (int i = 0; i < N; i++) {
fscanf(fp, "%s %d %d %f\n", pb->name, &(pb->num), &(pb->age), &(pb->score));
pb++;
}
pb = boyb;
for (int i = 0; i < N; i++) {
printf("%s %d %d %f\n", pb->name, pb->num, pb->age, pb->score);
pb++;
}
fclose(fp);
return 0;
}
Read and write files at random
The file reading and writing functions described above are sequential reading and writing , That is, reading and writing files can only start from scratch , Read and write data in sequence . But in the actual development, we often need to read and write the middle part of the file , To solve this problem , You have to move the position pointer inside the file first , Read and write again . This way of reading and writing is called random reading and writing , That is, start reading and writing from anywhere in the file .
The key to random reading and writing is to move the position pointer as required , This is called file positioning .
void rewind ( FILE *fp ); Used to move the position pointer to the beginning of the file
int fseek ( FILE *fp, long offset, int origin ); Used to move the position pointer to any position
- fp For file pointer , That is, the moved file .
- offset For offset , That is, the number of bytes to be moved . The reason is long type , I want to move more , Can handle larger files .offset Positive timing , Move backward ;offset When it is negative , Move forward .
- origin Is the starting position , That is, where to start calculating the offset .C The starting position specified by the language is Three , At the beginning of the file 、 Current location and end of file
Each position is represented by a corresponding constant :
- The starting point —— Constant names —— Constant values
- Beginning of file SEEK_SET 0
- The current position SEEK_CUR 1
- end of file SEEK_END 2
Be careful : fseek() Generally used for binary files , In the text file due to the need for conversion , The calculated position can sometimes go wrong .
Example :
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//ftell Returns the current file location indication
//
//fgetpos Get file location indicator
//
//fseek Move the file location indicator to the specified location in the file
//
//fsetpos Move the file location indicator to the specified location in the file
//
//rewind Move the file position indicator to the beginning of the file
#define N 3
struct stu {
char name[10]; // full name
int num; // Student number
int age; // Age
float score; // achievement
}boys[N], boy, * pboys;
int main() {
FILE* fp;
pboys = boys;
fp = fopen("test.txt", "w+");
puts("Input data:\n");
for (int i = 0; i < N; i++) {
scanf("%s %d %d %f", pboys->name, &pboys->num, &pboys->age, &pboys->score);
pboys++;
}
pboys = boys;
fwrite(pboys, sizeof(struct stu), N, fp);
rewind(fp);
fseek(fp, sizeof(struct stu), SEEK_SET);
fread(&boy, sizeof(struct stu), 1, fp);
printf("%s %d %d %f", boy.name, boy.num, boy.age, boy.score);
fclose(fp);
return 0;
}
C Language implementation file copy
#include "stdio.h"
#include "stdlib.h"
int main(int arg,char* argv[]){
if(arg!=3){
printf("input error!");
exit(0);
}
FILE* fpr = fopen(argv[1],"rb");
FILE* fpw = fopen(argv[2],"wb");
if(fpr==NULL||fpw==NULL) return 1;
fseek(fpr,0,SEEK_END);
int len = ftell(fpr);
rewind(fpr);
for(int i = 0;i<len;i++){
char ch = fgetc(fpr);
fputc(ch,fpw);
}
fclose(fpr);
fpr = NULL;
fclose(fpw);
fpw = NULL;
return 0;
}
Get file length
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int main(){
FILE* fp = fopen("test.txt", "r");
fseek(fp, 0, SEEK_END);
int len = ftell(fp);
rewind(fp);
printf(" The length of the file is :%d", len);// In file 0D 0A
return 0;
}
reference
边栏推荐
- IM即時通訊開發實現心跳保活遇到的問題
- sql刷题627. 变更性别
- 【Hot100】20. Valid parentheses
- The supply of chips has turned to excess, and the daily output of Chinese chips has increased to 1billion, which will make it more difficult for foreign chips
- 游戏行业安全选择游戏盾,效果怎么样?
- 数据库系统原理与应用教程(004)—— MySQL 安装与配置:重置 MySQL 登录密码(windows 环境)
- Principle of motion capture system
- What is the digital transformation of manufacturing industry
- How to repair the laptop that cannot connect to the wireless network
- Rhcsa Road
猜你喜欢

软件工程导论——第六章——详细设计

复杂度相关OJ题(LeetCode、C语言、复杂度、消失的数字、旋转数组)

实现数字永生还有多久?元宇宙全息真人分身#8i

学会了selenium 模拟鼠标操作,你就可以偷懒点点点了

Mlperf training v2.0 list released, with the same GPU configuration, the performance of Baidu PaddlePaddle ranks first in the world

Stonedb is building blocks for domestic databases, and the integrated real-time HTAP database based on MySQL is officially open source!

Problems encountered in IM instant messaging development to maintain heartbeat

数据库系统原理与应用教程(002)—— MySQL 安装与配置:MySQL 软件的卸载(windows 环境)

Kali install Nessus

Hi Fun Summer, play SQL planner with starrocks!
随机推荐
Go 语言错误处理为什么更推荐使用 pkg/errors 三方库?
Rhcsa Road
VMware 虚拟机启动时出现故障:VMware Workstation 与 Hyper-v 不兼容...
数据库系统原理与应用教程(003)—— MySQL 安装与配置:手工配置 MySQL(windows 环境)
VMware virtual machine failed during startup: VMware Workstation is incompatible with hyper-v
Stonedb is building blocks for domestic databases, and the integrated real-time HTAP database based on MySQL is officially open source!
P2592 [ZJOI2008]生日聚会(dp)
Principle of motion capture system
数据库系统原理与应用教程(006)—— 编译安装 MySQL5.7(Linux 环境)
Guide for high-end programmers to fish at work
The sharp drop in electricity consumption in Guangdong shows that the substitution of high-tech industries for high-energy consumption industries has achieved preliminary results
What is the digital transformation of manufacturing industry
巴比特 | 元宇宙每日必读:奈雪币、元宇宙乐园、虚拟股票游戏...奈雪的茶这波“操作拉满”的营销活动你看懂了吗?...
Zabbix2.2 monitoring system and application log monitoring alarm
Im instant messaging develops a message delivery scheme for 10000 people
制造业数字化转型究竟是什么
How does go use symmetric encryption?
全面看待企业数字化转型的价值
Exclusive news: Alibaba cloud quietly launched RPA cloud computer and has opened cooperation with many RPA manufacturers
Today, at 14:00, 15 ICLR speakers from Hong Kong University, Beihang, Yale, Tsinghua University, Canada, etc. continue!