Как лучше всего использовать fopen ()

Я нахожусь на стажировке, и я работаю над проектом симуляции 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,
Я хочу, чтобы первым лигном был номер лини (переменная 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

Для каждого символа, добавленного в моей первой строке, я вижу, что один мой символ из второй строки удаляется, я понимаю, почему, но я не могу найти никакого решения.

Не могли бы вы, ребята, помочь мне?

0

Решение

Там нет ничего плохого в поведении.

Если вы пишете символьный файл в середине или где-то не в конце, вы перезаписываете все, что находится в этой позиции.

Если вы хотите написать что-то еще, чем до конца (добавить), вам придется читать и записывать части файла, которые вы не изменили.

Кроме того, вы можете использовать std::ifstream / std::ofstream / std::fstream вместо.

2

Другие решения

fseek в первую очередь предназначен для поиска в двоичных файлах — в C / C ++ нет строковых файлов.

Я понимаю, что вы хотите добавить строку, а затем обновить первую строку на основе общего количества строк — и единственная возможность, которую я вижу, — это использовать пробел / ноль для заполнения количества строк, чтобы убедиться, что это всегда такой же длины, то есть что-то вроде:

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

Я не уверен, что желаемое поведение стандартизировано.

1

По вопросам рекламы [email protected]