有时需要将信息保存在Excel、Txt中,并且需要判断去重操作,重复时进行覆盖,不同时则在文件尾部写入。下述为自己写的一个例子:其中split为字符串分割函数,利用fseek进行重写数据的定位操作。
void writeExcel()
{
char buf[512] = {0};
int line_len = 0;
int len = 0;
int res;
FILE *pFile = nullptr;
pFile = fopen("G:\\test.csv","r+"); // Excel/txt相同,只需换后缀名即可
if (!pFile)
{
pFile = fopen("G:\\test.csv", "w"); // 如果文件不存在,则写入文件;如果文件存在,则用r+,读写模式,w会覆盖原来的内容,从开头开始写
}
char *pTemp = fgets(buf, sizeof(buf), pFile);
line_len = strlen(buf);
if (pTemp == nullptr)
{
fprintf(pFile, "%c,%d\n", 'a', 0);
fprintf(pFile, "%c,%d\n", 'b', 0);
fprintf(pFile, "%c,%d\n", 'c', 0);
fprintf(pFile, "%c,%d\n", 'd', 0);
}
else
{
len = len + line_len + 1; // 加1表示回车符
while (pTemp)
{
vector<string> vecBuf = split(buf, ',');
const char *first = vecBuf[0].c_str();
if ('c' == *first)
{
len = len - line_len - 1 ;
res = fseek(pFile, len, SEEK_SET); // len 从头开始到此为止长度
printf("%d\n", res);
fprintf(pFile, "%c,%d\n", 'd', 1); // 重写一行数据
break;
}
else
{
pTemp = fgets(buf, sizeof(buf), pFile);
line_len = strlen(buf) ;
len = len + line_len + 1;
}
}
if ( nullptr == pTemp )
{
fprintf(pFile, "%c,%d\n", 's', 1);
}
}
/*利用ftell进行定位,注意换行符*/
/*else
{
while (pTemp)
{
vector<string> vecBuf = split(buf, '\t');
const char *first = vecBuf[0].c_str();
if ('a' == *first)
{
len = ftell(pFile) - line_len - 1;
res = fseek(pFile, len, SEEK_SET);
printf("%d\n", res);
fprintf(pFile, "%c\t%d\n", 'd', 1);
break;
}
else
{
pTemp = fgets(buf, sizeof(buf), pFile);
line_len = strlen(buf);
len += line_len;
}
if (pTemp == nullptr)
{
fprintf(pFile, "%c\t%d\n", 's', 1);
}
}
}*/
fclose(pFile);
}
完整例子链接:https://download.csdn.net/download/silence_lu_/10589411