我正在实习,我正在研究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
对于我在第一行添加的每个字符,我可以看到第二行中的一个字符被删除,我理解为什么但我找不到任何解决方案。
你们能帮助我吗?
答案 0 :(得分:2)
这种行为没有错。
如果您编写一个字符mid文件或不在末尾的某个地方,则会覆盖该位置的任何内容。
如果你想写到别的地方而不是写到最后(追加),你必须阅读和写下你没有修改过的文件部分。
此外,您可能希望改为使用std::ifstream
/ std::ofstream
/ std::fstream
。
答案 1 :(得分:1)
fseek主要用于搜索二进制文件--C / C ++中没有基于行的文件。
我知道你要追加一行,然后根据行总数更新第一行 - 我唯一可以看到的是使用空格/零来填充行数以确保它总是长度相同,例如:
fprintf(fichier, "%10ld \n", nombre_lignes);
我不确定所需的行为是否标准化。