C/C++学习——文件的输入输出

本文介绍了C语言中的文件操作,包括使用fopen、fclose、fprintf、fscanf和fgets进行文件的打开、关闭、读写。示例代码演示了如何写入和读取文本文件。同时提到了C++中的fstream库,用于读写文件,以及在Webots仿真中的应用示例,展示了如何将仿真时间写入文件。

C文件操作

打开文件

FILE *fopen(const char * filename, const char * mode);

常见的mode有:
‘a’:打开已有或创建文件,在原有内容上追加内容。

modeDescription
r打开已有文本允许读取文件
w打开已有或创建文件,允许写入,如果是已有文件要删掉内容重新写入
a打开已有或创建文件,在原有内容上追加内容
r+打开文本文件,允许读写
w+打开文本文件,允许读写,如果是已有文件要删掉内容重新写入
a+打开文本文件,允许读写,在原有内容上追加内容

关闭文件

清空缓冲区数据并关闭文件

int fclose(FILE *fp);

写入文件

可以使用fprintf() 函数将一个字符串写入到文件中;

int fprintf(FILE *fp, const char *format, ...)

示例:

#include <stdio.h>

int main() {
   FILE *fp = NULL;

   fp = fopen("test.txt", "w+");
   fprintf(fp, "This is testing programme.\n");
   fclose(fp);
   return 0;
}

读取文件

  • 函数fgetc() 从 fp 所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回 EOF。
int fgetc(FILE *fp);
  • 函数fgets() 从 fp 所指向的输入流中读取 n-1 个字符。它会把读取的字符串复制到缓冲区 buf,并在最后追加一个 null 字符来终止字符串。如果这个函数在读取最后一个字符之前就遇到一个换行符 ‘\n’ 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。
char *fgets(char *buf, int n, FILE *fp);
  • 可以使用fscanf() 函数来从文件中读取字符串,但是在遇到第一个空格和换行符时,它会停止读取。
int fscanf(FILE *fp, const char *format, ...)

示例:

#include <stdio.h>

int main() {
   FILE *fp = NULL;
   char buff[255];

   fp = fopen("test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1: %s\n", buff);

   fgets(buff, 255, fp);
   printf("2: %s\n", buff);
   
   /* 使用显示的强制类型转换,实际上可忽略 */
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);

   return 0;
}

运行结果:

1: This
2:  is testing for fprintf...

3: This is testing for fputs...

首先,fscanf() 函数只读取了 This,因为它在后边遇到了一个空格。其次,调用 fgets() 读取剩余的部分,直到行尾。最后,调用 fgets() 完整地读取第二行。
参考:https://blog.youkuaiyun.com/Jmilk/article/details/105312774

C++文件操作

fstream头文件定义了三种支持文件IO的类型:

  1. ifstream,由istream派生而来,提供读文件功能;
  2. ofstream,由ostream派生而来,提供写文件功能;
  3. fstream,由iostream派生而来,提供读写同一文件功能;
    使用示例:
//定义infile为读文件流对象,outfile为写文件流对象,不捆绑具体文件
ifstream infile;  //unbound input file stream
ofstream outfile; //unbound output file stream
//捆绑具体对象
infile.open("in");   //open file named "in" in the current directory
outfile.open("out"); //open file named "out" in the current directory

outfile.close();     //close file when we are done with if
outfile.clear();     //reset state to ok

示例,Webots仿真中六足水下控制的一部分代码,将系统仿真时间持续输出到文本文件test.txt 中:

#include <fstream>
ofstream outfile("test.txt");
outfile << "开始输入" << endl;

double t = robot->getTime();
//t = t * 1000 / 32;
//t = (int) t;
outfile << t << endl;
对于零基础学习者,以下是几种使用C/C++实现统计单词个数的方法: ### 统计文件中单词个数(C语言实现) 此方法用于统计文件中的单词个数。代码会打开指定文件,逐个字符读取,根据分隔符判断单词边界并计数。 ```c #include <stdio.h> #define IN 0 #define OUT 1 #define INIT OUT int countword(char * filename) { int status = INIT; int res = 0; if(filename == NULL) return -1; FILE * fp = fopen(filename,"r"); if(fp == NULL) return -1; char ch; while((ch = fgetc(fp)) != EOF) { if('\n' == ch || '\t' == ch || ' ' == ch || ',' == ch || '.' == ch || '!' == ch || '\'' == ch || '\"' == ch || '\r' == ch) { status = OUT; } else if(status == OUT) { status = IN; res++; } } return res; } int main(int argc,char *argv[]) { if(argc < 2) return -1; printf("the word is %d\n",countword(argv[1])); return 0; } ``` ### 统计控制台输入单词个数(C++实现) 该方法允许用户在控制台输入多个单词,通过判断输入是否结束来统计单词个数和字符总长度。 ```cpp #include <iostream> #include <Windows.h> #include <string> using namespace std; int main(void) { string name; int count = 0; int length = 0; cout << "请输入多个单词:" << endl; while (1) { // 设置当遇到结束符时(EOF)时跳出循环 // C++,输入控制台的结束符(Ctrl+Z),返回值为0 if (cin >> name) { count++; length += name.size(); } else { break; } } cout << "一共输入" << count << "个单词" << length << "个字符" << endl; return 0; } ``` ### 统计长字符串中特定单词出现次数(C++实现) 此方法用于在一个长字符串中统计特定单词出现的次数,并记录该单词第一次出现的位置。 ```cpp #include <iostream> #include <string> using namespace std; int main() { string c; // 要匹配的字符串 string s; // 待匹配的长字符串 cin >> c; getchar(); // 把\n从缓冲区取出,防止getline直接跳过 getline(cin, s); // 读取一行待匹配的长字符串 // 这俩循环是将俩字符串都统一改成全小写 for (int i = 0; i < c.length(); i++) { c[i] = tolower(c[i]); } for (int i = 0; i < s.length(); i++) { s[i] = tolower(s[i]); } // 都各自在前后加一个空格 c = " " + c + " "; s = " " + s + " "; // 先find一下有没有 if (s.find(c) == string::npos) { cout << -1; // 没有就直接输出了 } else { // 有的话就开始找 int firstPos = s.find(c); // 记录第一次出现的位置 int pos = firstPos; int cnt = 0; // 统计完全匹配次数 while (pos!=string::npos) { cnt++; pos = s.find(c, pos + 1); } cout << cnt << " " << firstPos; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值