Я нахожусь на стажировке, и я работаю над проектом симуляции 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
Для каждого символа, добавленного в моей первой строке, я вижу, что один мой символ из второй строки удаляется, я понимаю, почему, но я не могу найти никакого решения.
Не могли бы вы, ребята, помочь мне?
Там нет ничего плохого в поведении.
Если вы пишете символьный файл в середине или где-то не в конце, вы перезаписываете все, что находится в этой позиции.
Если вы хотите написать что-то еще, чем до конца (добавить), вам придется читать и записывать части файла, которые вы не изменили.
Кроме того, вы можете использовать std::ifstream
/ std::ofstream
/ std::fstream
вместо.
fseek в первую очередь предназначен для поиска в двоичных файлах — в C / C ++ нет строковых файлов.
Я понимаю, что вы хотите добавить строку, а затем обновить первую строку на основе общего количества строк — и единственная возможность, которую я вижу, — это использовать пробел / ноль для заполнения количества строк, чтобы убедиться, что это всегда такой же длины, то есть что-то вроде:
fprintf(fichier, "%10ld \n", nombre_lignes);
Я не уверен, что желаемое поведение стандартизировано.