• C_C++在linux和windows下文件操作比较总结


    在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 的效率最高,对文件读写的控制最强,缺点就是比较复杂,而且代码没有可移植性。
    2) 类linux系统IO
    VC++的C运行时库实现了一套类似linux的IO函数,头文件是io.h, 如:_wsopen_s,_open,_write,_read ...

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

    4.标准C语言操作文件

    1)文本文件

    1. #include
    2. #include
    3. void cReadWriteTxtFile() {
    4. // r+ r:操作的文件必须存在, 读写都是从文件开头开始
    5. // w:写文件,清除原有文件内容 w+:写文件,清除原有文件内容
    6. // a:附加方式打开写文件,文件不存在会创建 a +:附加方式读写文件,读从文件开头, 写从文件末尾开始,文件不存在会创建
    7. FILE * fp = fopen("c_txt_file.txt", "w");
    8. if (!fp)
    9. {
    10. printf("write mode open file error!\n");
    11. return;
    12. }
    13. int i = 1;
    14. while (i <= 200) {
    15. fprintf(fp, "%d %s\n", i++, "C operate txt file");
    16. }
    17. fclose(fp);
    18. fp = NULL;
    19. // r+ 和 r打开文件时候,文件必须存在,否则文件指针为空
    20. fp = fopen("c_txt_file.txt", "r+");
    21. if (!fp)
    22. {
    23. printf("read mode open file error!\n");
    24. return;
    25. }
    26. char buffer[1024] = {0};
    27. int line_num = 0;
    28. while (!feof(fp))
    29. {
    30. memset(buffer, 0, sizeof buffer);
    31. //fgets可以从文件中读取一行字符串,fgets()函数自带回车符
    32. fgets(buffer, 1024, fp);
    33. //注意这行代码,当fp指向EOF的下一个位置时,feof才会返回true
    34. if (feof(fp)) {
    35. break;
    36. }
    37. printf("line %d: %s", ++line_num, buffer); //输出
    38. }
    39. fclose(fp);
    40. fp = NULL;
    41. }
    42. int main()
    43. {
    44. cReadWriteTxtFile();
    45. return 0;
    46. }

    2)二进制文件

    1. #include
    2. #include
    3. #include
    4. void cReadWriteBinFile() {
    5. FILE * fp = fopen("c_bin_file.dat", "wb");
    6. if (!fp)
    7. {
    8. printf("write mode open file error!\n");
    9. return;
    10. }
    11. int value;
    12. int unit_size = sizeof(int);
    13. for (int i = 0; i < 100; i++) {
    14. value = i;
    15. fwrite(&value, sizeof(int), 1, fp);
    16. }
    17. fclose(fp);
    18. fp = NULL;
    19. // r+ 和 r打开文件时候,文件必须存在,否则文件指针为空
    20. fp = fopen("c_bin_file.dat", "rb+");
    21. if (!fp)
    22. {
    23. printf("read mode open file error!\n");
    24. return;
    25. }
    26. //计算文件大小
    27. fseek(fp, 0, SEEK_END);
    28. long file_size = ftell(fp);
    29. rewind(fp); // <====> fseek(fp, 0L, SEEK_SET);
    30. int e_num = file_size / unit_size;
    31. int *parr = (int*)malloc(file_size);
    32. for (int i = 0; i < e_num; i++) {
    33. fread(&parr[i], unit_size, 1, fp);
    34. printf("%d %d\n", i, (int)parr[i]);
    35. }
    36. free(parr);
    37. fclose(fp);
    38. fp = NULL;
    39. }
    40. int main()
    41. {
    42. cReadWriteBinFile();
    43. return 0;
    44. }

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

    1)文本文件

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. //文件打开方式选项:
    7. // ios::in    = 0x01, //供读,文件不存在则创建(ifstream默认的打开方式)
    8. // ios::out    = 0x02, //供写,文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)
    9. // ios::ate    = 0x04, //文件打开时,指针在文件最后。可改变指针的位置,常和in、out联合使用
    10. // ios::app    = 0x08, //供写,文件不存在则创建,若文件已存在则在原文件内容后写入新的内容,指针位置总在最后
    11. // ios::trunc   = 0x10, //在读写前先将文件长度截断为0(默认)
    12. // ios::nocreate = 0x20, //文件不存在时产生错误,常和in或app联合使用
    13. // ios::noreplace = 0x40, //文件存在时产生错误,常和out联合使用
    14. // ios::binary  = 0x80  //二进制格式文件
    15. void cppReadByByte() {
    16. fstream fin;
    17. fin.open("cpp_txt.txt", ios::in);
    18. //按字节读取
    19. char ch;
    20. while (EOF != (ch = fin.get()))
    21. cout << ch;
    22. fin.close();
    23. }
    24. void cppReadByLine() {
    25. fstream fin;
    26. fin.open("cpp_txt.txt", ios::in);
    27. char line_buf[1024];
    28. int read_num;
    29. fin.getline(line_buf, sizeof(line_buf));
    30. cout << line_buf << "\t" << endl;
    31. //tellg() 得到文件指针当前指向的文件位置。
    32. //seekg(0, ios::beg); //让文件指针定位到文件开头
    33. //seekg(0, ios::end); //让文件指针定位到文件末尾
    34. //seekg(10, ios::cur); //让文件指针从当前位置向文件末方向移动10个字节
    35. //seekg(-10, ios::cur); //让文件指针从当前位置向文件开始方向移动10个字节
    36. //seekg(10, ios::beg); //让文件指针定位到离文件开头10个字节的位置
    37. while (!fin.eof())
    38. {
    39. fin.getline(line_buf, sizeof(line_buf));
    40. if (fin.eof()) {
    41. break;
    42. }
    43. //gcount()表示实际读取的字节数
    44. read_num = fin.gcount();
    45. cout << read_num << ": \t" << line_buf << endl;
    46. }
    47. fin.close();
    48. }
    49. void cppReadByFormat() {
    50. fstream fin;
    51. fin.open("cpp_txt.txt", ios::in);
    52. int first = 1, second = 2, third = 3;
    53. string str;
    54. while (!fin.eof())
    55. {
    56. //此处注意,读数值会跳过空格和tab,无论是数字或者字符串
    57. fin >> first >> second >> third >> str;
    58. if (fin.eof()) {
    59. break;
    60. }
    61. cout << first << '\t' << second << "\t" << third << ends << "\t\t\t\t" << str << std::endl;
    62. }
    63. fin.close();
    64. }
    65. void cppReadWritetxtFile() {
    66. fstream fout("cpp_txt.txt", ios::out);
    67. if (!fout.is_open()){
    68. cout << "open cpp_txt.txt error !" << endl;
    69. return;
    70. }
    71. for (int i = 0; i < 10; i++) {
    72. fout << setw(5) << i + 10 << "\t" << setw(10) << i + 1 << "\t" << setw(10) << i + 2 << "hello " << endl;
    73. }
    74. fout.close();
    75. cppReadByFormat();
    76. }
    77. int main()
    78. {
    79. cppReadWritetxtFile();
    80. return 0;
    81. }

    2)二进制文件

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. //说明:C++读写二进制数据需要使用 ifstream和ofstream,读写文本文件,ifstream和ofstream和fstream都可以
    7. void cppReadWriteBinFile() {;
    8. ofstream fout;
    9. fout.open("cpp_bin.dat", ios::binary);
    10. if (!fout){
    11. cout << "open cpp_bin.dat error !" << endl;
    12. return;
    13. }
    14. int value = 0;
    15. for (int i = 0; i < 10; i++) {
    16. value = i;
    17. fout.write((char*)&value, sizeof(int));
    18. }
    19. fout.close();
    20. ifstream fin;
    21. fin.open("cpp_bin.dat", ios::binary);
    22. int num = 0;
    23. while (!fin.eof())
    24. {
    25. fin.read((char*)&num, sizeof(int));
    26. if (fin.eof()) {
    27. break;
    28. }
    29. cout << num << std::endl;
    30. }
    31. fin.close();
    32. }
    33. int main()
    34. {
    35. cppReadWriteBinFile();
    36. return 0;
    37. }

  • 相关阅读:
    FastAPI学习-17.其它响应html,文件,视频或其它
    在建工程预转固后 预转固卡片一次性计提了折旧 后续月份又发生了价值调减的情况
    Java语法之继承
    yolov8-OBB检测角度问题
    解决报错: YarnScheduler: Initial job has not accepted any resources
    bclinux aarch64 ceph 14.2.10 对象存储 http网关 CEPH OBJECT GATEWAY Civetweb
    Golang 基础二
    ​Segment-and-Track Anything——通用智能视频分割、跟踪、编辑算法解读与源码部署
    3招学会TikTok电商选品,速看
    Autofac 注入仓储模式
  • 原文地址:https://blog.csdn.net/hsy12342611/article/details/128005148