0

我正在实习,并且正在从事 SLAM 模拟项目,在将云点写入文件时遇到了一个小问题。

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

        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在之前被调用ecriture_fichier。我希望第一个 ligne 是 ligne (变量nombre_lignes)的数量,但是当我执行此代码时,我在文件中得到以下结果:

8070 
00000 5.200000 
5.200000 5.200000 
5.200000 5.200000 
5.200000 5.200000 
5.200000 5.200000 
5.200000 5.200000 

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

你们能帮帮我吗?

4

2 回答 2

2

行为没有任何问题。

如果你写一个字符中间文件或不在末尾的某个地方,你会覆盖那个位置的任何东西。

如果您想写到结尾(追加)以外的其他地方,则必须读取和写入您未修改的文件部分。

此外,您可能希望使用std::ifstream/ std::ofstream/std::fstream代替。

于 2017-05-10T09:17:37.190 回答
1

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

我知道您想附加一行,然后根据总行数更新第一行 - 我能看到的唯一可能性是使用空格/零来填充行数以确保它始终是相同的长度,即类似:

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

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

于 2017-05-10T09:20:00.410 回答