C/C++ CSV文件断点续写:不同代码段分写字段与行实现方法
问题解答
该需求完全可实现,你调用fseek未生效的核心原因是文件打开模式使用错误。
你现有代码中使用fopen("xxx.csv", "w+")打开文件,w系列的打开模式只要执行就会直接清空文件原有全部内容,哪怕后续调用fseek定位到文件末尾,原有内容已经被删除,自然无法实现追加效果。
正确实现方案
C语言版本
要实现追加写入,直接使用**追加模式a/a+**打开文件即可,无需额外调用fseek,系统会自动将写入内容追加到文件末尾:
a:仅支持写入,文件不存在则自动创建,写入内容自动追加到末尾a+:支持读+追加写入,其余特性和a一致
修正后示例代码如下:
#include <stdlib.h> #include <stdio.h> //function declaration int fonit(int count); int main(int argc, char const *argv[]) { int a=100; int b=a/10; // 首次创建文件用w模式清空旧内容,后续追加都用a模式 FILE *init_file = fopen("fant.csv", "w"); fclose(init_file); init_file = fopen("ant.csv", "w"); fclose(init_file); for (int a = 0; a < 10; a++) { // 写入fant.csv,用a模式追加 FILE *file = fopen("fant.csv", "a"); fprintf(file, "%d,", a); fclose(file); for (int j = 0; j < 10; j++){ fonit(j); } // 写入ant.csv行尾内容 file = fopen("ant.csv", "a"); fprintf(file, "%d,\n", b); fclose(file); } return 0; } int fonit(int count){ int k=0; for (int i = 0; i < count; i++) { for (int j = 0; j < 100; j++) { k=j%2; } // 追加写入ant.csv FILE *file = fopen("ant.csv", "a"); fprintf(file, "%d,", k); fclose(file); } return 0; }
优化建议:如果写入操作比较频繁,建议全程保持文件句柄打开状态,不需要每次写入都开闭文件,能大幅提升写入性能。
C++版本
C++中使用文件流操作时,添加ios::app打开标记即可实现追加写入,示例代码如下:
#include <fstream> #include <string> int main() { // 打开文件时指定ios::app标记,写入自动追加到末尾 std::ofstream out("ant.csv", std::ios::app); if (out.is_open()) { // 直接写入即可,自动追加到文件末尾 out << "列1,列2,列3\n"; out << 1 << "," << 2 << "," << 3 << "\n"; out.close(); } return 0; }
内容的提问来源于stack exchange,提问作者Zubeyir
相关产品推荐
相关产品推荐

