C_C++在linux和windows下文件操作比较总结
admin
2024-02-10 08:16:56
0

在C/C++语言开发中,文件读写很常用的操作。文件读写主要涉及文本文件和二进制文件,今天就对其使用进行总结:

1.C/C++标准跨平台读写文件
1)C语言读写文件通过FILE指针操作,文本文件读写用fgetc, fgets, fprintf,fscanf,二进制文件读写用fread,fwrite
2)C++读写文件通过fstream,ifstream,ofstream进行操作,构造函数中指定文件路径时内部会调用open(),如果再次调用open(),
调用将会返回失败,文本文件用<< 和 >> 进行读写,二进制文件用read和write进行读写


2.windows下文件读写
1.系统API
使用VC++读写文件,最直接、最高效的方法就是使用 Windows API,如:使用 CreateFile 打开文件,使用 WriteFile 写文件,使用 ReadFile 读文件……Windows 平台下,所有对文件的读写操作,最终都会调用这些 API 函数。使用 API 的效率最高,对文件读写的控制最强,缺点就是比较复杂,而且代码没有可移植性。
1.2类linux系统IO
VC++的C运行时库实现了一套类似linux的IO函数,头文件是io.h, 如:_wsopen_s,_open,_write,_read ...

3.linux下文件读写
linux系统api,如open,read,write等
 

4.标准C语言操作文件

1)文本文件

#include
#include void cReadWriteTxtFile() {// r+ r:操作的文件必须存在, 读写都是从文件开头开始// w:写文件,清除原有文件内容 w+:写文件,清除原有文件内容// a:附加方式打开写文件,文件不存在会创建  a +:附加方式读写文件,读从文件开头, 写从文件末尾开始,文件不存在会创建FILE * fp = fopen("c_txt_file.txt", "w");if (!fp){printf("write mode open file error!\n");return;}int i = 1;while (i <= 200) {fprintf(fp, "%d %s\n", i++, "C operate txt file");}fclose(fp);fp = NULL;// r+ 和 r打开文件时候,文件必须存在,否则文件指针为空fp = fopen("c_txt_file.txt", "r+");if (!fp){printf("read mode open file error!\n");return;}char buffer[1024] = {0};int line_num = 0;while (!feof(fp)){memset(buffer, 0, sizeof buffer);//fgets可以从文件中读取一行字符串,fgets()函数自带回车符 fgets(buffer, 1024, fp);//注意这行代码,当fp指向EOF的下一个位置时,feof才会返回trueif (feof(fp)) {break;}printf("line %d: %s", ++line_num, buffer); //输出}fclose(fp);fp = NULL;
}int main()
{cReadWriteTxtFile();return 0;
}

2)二进制文件

#include
#include 
#include void cReadWriteBinFile() {FILE * fp = fopen("c_bin_file.dat", "wb");if (!fp){printf("write mode open file error!\n");return;}int value;int unit_size = sizeof(int);for (int i = 0; i < 100; i++) {value = i;fwrite(&value, sizeof(int), 1, fp);}fclose(fp);fp = NULL;// r+ 和 r打开文件时候,文件必须存在,否则文件指针为空fp = fopen("c_bin_file.dat", "rb+");if (!fp){printf("read mode open file error!\n");return;}//计算文件大小fseek(fp, 0, SEEK_END);long file_size = ftell(fp);rewind(fp);  // <====> fseek(fp, 0L, SEEK_SET);int e_num = file_size / unit_size;int *parr = (int*)malloc(file_size);for (int i = 0; i < e_num; i++) {fread(&parr[i], unit_size, 1, fp);printf("%d %d\n", i, (int)parr[i]);}free(parr);fclose(fp);fp = NULL;
}int main()
{cReadWriteBinFile();return 0;
}

5.标准C++语言操作文件

1)文本文件

#include 
#include 
#include 
#include using namespace std;//文件打开方式选项:
// ios::in    = 0x01, //供读,文件不存在则创建(ifstream默认的打开方式)
// ios::out    = 0x02, //供写,文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)
// ios::ate    = 0x04, //文件打开时,指针在文件最后。可改变指针的位置,常和in、out联合使用
// ios::app    = 0x08, //供写,文件不存在则创建,若文件已存在则在原文件内容后写入新的内容,指针位置总在最后
// ios::trunc   = 0x10, //在读写前先将文件长度截断为0(默认)
// ios::nocreate = 0x20, //文件不存在时产生错误,常和in或app联合使用
// ios::noreplace = 0x40, //文件存在时产生错误,常和out联合使用
// ios::binary  = 0x80  //二进制格式文件void cppReadByByte() {fstream fin;fin.open("cpp_txt.txt", ios::in);//按字节读取char ch;while (EOF != (ch = fin.get()))cout << ch;fin.close();
}void cppReadByLine() {fstream fin;fin.open("cpp_txt.txt", ios::in);char line_buf[1024];int read_num;fin.getline(line_buf, sizeof(line_buf));cout << line_buf << "\t" << endl;//tellg() 得到文件指针当前指向的文件位置。//seekg(0, ios::beg);   //让文件指针定位到文件开头//seekg(0, ios::end);   //让文件指针定位到文件末尾//seekg(10, ios::cur);   //让文件指针从当前位置向文件末方向移动10个字节//seekg(-10, ios::cur);   //让文件指针从当前位置向文件开始方向移动10个字节//seekg(10, ios::beg);   //让文件指针定位到离文件开头10个字节的位置while (!fin.eof()){fin.getline(line_buf, sizeof(line_buf));if (fin.eof()) {break;}//gcount()表示实际读取的字节数read_num = fin.gcount();cout << read_num << ": \t" << line_buf << endl;}fin.close();
}void cppReadByFormat() {fstream fin;fin.open("cpp_txt.txt", ios::in);int first = 1, second = 2, third = 3;string str;while (!fin.eof()){//此处注意,读数值会跳过空格和tab,无论是数字或者字符串fin >> first >> second >> third >> str;if (fin.eof()) {break;}cout << first << '\t' << second << "\t" << third << ends << "\t\t\t\t" << str << std::endl;}fin.close();
}void cppReadWritetxtFile() {fstream fout("cpp_txt.txt", ios::out);if (!fout.is_open()){cout << "open cpp_txt.txt error !" << endl;return;}for (int i = 0; i < 10; i++) {fout << setw(5) << i + 10 << "\t" << setw(10) << i + 1 << "\t" << setw(10) << i + 2 << "hello " << endl;}fout.close();cppReadByFormat();
}int main()
{cppReadWritetxtFile();return 0;
}#include 
#include 
#include 
#include using namespace std;//文件打开方式选项:
// ios::in    = 0x01, //供读,文件不存在则创建(ifstream默认的打开方式)
// ios::out    = 0x02, //供写,文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)
// ios::ate    = 0x04, //文件打开时,指针在文件最后。可改变指针的位置,常和in、out联合使用
// ios::app    = 0x08, //供写,文件不存在则创建,若文件已存在则在原文件内容后写入新的内容,指针位置总在最后
// ios::trunc   = 0x10, //在读写前先将文件长度截断为0(默认)
// ios::nocreate = 0x20, //文件不存在时产生错误,常和in或app联合使用
// ios::noreplace = 0x40, //文件存在时产生错误,常和out联合使用
// ios::binary  = 0x80  //二进制格式文件void cppReadByByte() {fstream fin;fin.open("cpp_txt.txt", ios::in);//按字节读取char ch;while (EOF != (ch = fin.get()))cout << ch;fin.close();
}void cppReadByLine() {fstream fin;fin.open("cpp_txt.txt", ios::in);char line_buf[1024];int read_num;fin.getline(line_buf, sizeof(line_buf));cout << line_buf << "\t" << endl;//tellg() 得到文件指针当前指向的文件位置。//seekg(0, ios::beg);   //让文件指针定位到文件开头//seekg(0, ios::end);   //让文件指针定位到文件末尾//seekg(10, ios::cur);   //让文件指针从当前位置向文件末方向移动10个字节//seekg(-10, ios::cur);   //让文件指针从当前位置向文件开始方向移动10个字节//seekg(10, ios::beg);   //让文件指针定位到离文件开头10个字节的位置while (!fin.eof()){fin.getline(line_buf, sizeof(line_buf));if (fin.eof()) {break;}//gcount()表示实际读取的字节数read_num = fin.gcount();cout << read_num << ": \t" << line_buf << endl;}fin.close();
}void cppReadByFormat() {fstream fin;fin.open("cpp_txt.txt", ios::in);int first = 1, second = 2, third = 3;string str;while (!fin.eof()){//此处注意,读数值会跳过空格和tab,无论是数字或者字符串fin >> first >> second >> third >> str;if (fin.eof()) {break;}cout << first << '\t' << second << "\t" << third << ends << "\t\t\t\t" << str << std::endl;}fin.close();
}void cppReadWritetxtFile() {fstream fout("cpp_txt.txt", ios::out);if (!fout.is_open()){cout << "open cpp_txt.txt error !" << endl;return;}for (int i = 0; i < 10; i++) {fout << setw(5) << i + 10 << "\t" << setw(10) << i + 1 << "\t" << setw(10) << i + 2 << "hello " << endl;}fout.close();cppReadByFormat();
}int main()
{cppReadWritetxtFile();return 0;
}

2)二进制文件

#include 
#include 
#include 
#include using namespace std;//说明:C++读写二进制数据需要使用 ifstream和ofstream,读写文本文件,ifstream和ofstream和fstream都可以
void cppReadWriteBinFile() {;ofstream fout;fout.open("cpp_bin.dat", ios::binary);if (!fout){cout << "open cpp_bin.dat error !" << endl;return;}int value = 0;for (int i = 0; i < 10; i++) {value = i;fout.write((char*)&value, sizeof(int));}fout.close();ifstream fin;fin.open("cpp_bin.dat", ios::binary);int num = 0;while (!fin.eof()){fin.read((char*)&num, sizeof(int));if (fin.eof()) {break;}cout << num << std::endl;}fin.close();}int main()
{cppReadWriteBinFile();return 0;
}

相关内容

热门资讯

安卓系统打游戏推荐,一触即达! 你有没有发现,现在手机游戏越来越好玩了?不管是休闲小游戏还是大型MMORPG,都能在手机上畅玩。但是...
开店宝系统和安卓,助力商家轻松... 你有没有想过,开店也能变得如此轻松?没错,就是那个神奇的“开店宝系统”,它可是安卓平台上的一大神器呢...
安卓平板装早教机系统,安卓平板... 你有没有想过,家里的安卓平板除了刷剧、玩游戏,还能变成一个超级早教机呢?没错,就是那种能让孩子从小接...
电脑装安卓系统好处,电脑装安卓... 你有没有想过,你的电脑装上安卓系统会有什么神奇的变化呢?想象一台原本只能处理文档和PPT的电脑,突然...
HTC莫扎特刷安卓系统,畅享全... 你有没有听说过HTC莫扎特这款手机?最近,它可是刷爆了安卓系统爱好者们的眼球呢!今天,就让我带你一起...
安卓系统的致命漏洞,揭秘潜在安... 你知道吗?最近安卓系统可是闹出了一个大新闻,一个致命的漏洞让无数用户都紧张兮兮的。咱们就来聊聊这个事...
安卓的系统文件在哪,安卓系统文... 你有没有想过,你的安卓手机里那些神秘的系统文件都藏在哪个角落呢?别急,今天就来带你一探究竟,让你对这...
公认最好的安卓系统,揭秘公认最... 你有没有想过,为什么安卓手机那么受欢迎?是不是因为那个公认最好的安卓系统?没错,今天咱们就来聊聊这个...
安卓系统默认音量调整,轻松设置... 你有没有发现,每次拿起手机,那个默认的音量调整按钮总是那么默默无闻地躺在那里?今天,就让我带你一探究...
照片怎样导出安卓系统,一键导出... 你有没有遇到过这种情况:手机里存了好多美美的照片,想分享给朋友或者保存到电脑上,却发现导出照片到安卓...
什么电视支持安卓系统,解锁智能... 你有没有想过,家里的电视是不是也能像手机一样,随时随地下载各种应用,畅享网络世界呢?没错,现在很多电...
鸿蒙系统投屏安卓系统电视,开启... 亲爱的读者们,你是否曾想过,家里的安卓电视也能享受到鸿蒙系统的魅力呢?没错,今天就要来聊聊这个让人眼...
安卓系统如何连手柄,安卓系统下... 你有没有想过,在安卓系统上玩游戏的时候,如果能够用上游戏手柄,那该有多爽啊!想象手指轻轻一按,游戏角...
安卓打包当前系统rom,基于安... 你有没有想过,手机里的安卓系统其实就像是一个个精心打造的城堡,而ROM就像是这座城堡的装修风格。今天...
索爱售后安卓系统,索爱售后安卓... 你有没有遇到过手机售后的问题呢?尤其是那些安卓系统的手机,有时候出了点小状况,真是让人头疼。今天,咱...
安卓7.0系统速度咋样,速度与... 你有没有发现,自从手机更新到安卓7.0系统后,感觉整个手机都焕然一新了呢?今天,就让我来给你详细聊聊...
安卓文件系统隔离,Androi... 你知道吗?在安卓的世界里,有一个神奇的小秘密,那就是安卓文件系统隔离。听起来是不是有点高大上?别急,...
电脑板安卓系统下载,轻松实现多... 你有没有想过,你的电脑板突然间变得如此强大,竟然能运行安卓系统?没错,这就是科技的魅力!今天,就让我...
安卓系统双开app排行,热门双... 安卓系统双开App排行大揭秘在数字化时代,手机已经成为我们生活中不可或缺的一部分。而安卓系统,作为全...
安卓原生系统谁在开发,谷歌主导... 你有没有想过,那个陪伴你每天刷抖音、玩游戏、办公的安卓系统,究竟是谁在背后默默开发呢?今天,就让我带...