使用fopen()的最佳方法是什么

时间:2017-05-10 09:08:55

标签: c++ file fopen slam

我正在实习,我正在研究SLAM模拟项目,我在将云点写入文件时遇到了一些问题。

这是我的代码,我有两个功能:

 user_id     item            inc_count
 87654       Headphone       1
 87654       Mouse pad       2
 20846       Mousepad        1
 45661       Headphone       1
 45661       iPhone          2
 45661       iPad            3
 45661       GoPro           4

void ecriture_fichier(double x, double y){ FILE *fichier = NULL; fichier = fopen("/home/stagiairepierrick/points/points.txt", "a"); if(fichier != NULL ){ fprintf(fichier, "%lf %lf \n",x,y); } else { std::cerr << "probleme ecriture" << std::endl; } fclose(fichier); } void ajout_nombre_lignes(long nombre_lignes){ FILE *fichier = NULL; fichier = fopen("/home/stagiairepierrick/points/points.txt", "r+"); if(fichier != NULL ){ fseek(fichier, 0, SEEK_SET); fprintf(fichier, "%ld \n", nombre_lignes); } else { std::cerr << "probleme ecriture nombre de lignes" << std::endl; } fclose(fichier); } 之前调用函数ajout_nombre_ligne。 我希望第一个lign是ligne的数量(变量ecriture_fichier),但是当我执行此代码时,我在我的文件中得到以下结果:

nombre_lignes

对于我在第一行添加的每个字符,我可以看到第二行中的一个字符被删除,我理解为什么但我找不到任何解决方案。

你们能帮助我吗?

2 个答案:

答案 0 :(得分:2)

这种行为没有错。

如果您编写一个字符mid文件或不在末尾的某个地方,则会覆盖该位置的任何内容。

如果你想写到别的地方而不是写到最后(追加),你必须阅读和写下你没有修改过的文件部分。

此外,您可能希望改为使用std::ifstream / std::ofstream / std::fstream

答案 1 :(得分:1)

fseek主要用于搜索二进制文件--C / C ++中没有基于行的文件。

我知道你要追加一行,然后根据行总数更新第一行 - 我唯一可以看到的是使用空格/零来填充行数以确保它总是长度相同,例如:

 fprintf(fichier, "%10ld \n", nombre_lignes);

我不确定所需的行为是否标准化。