使用 fopen() 的最佳方法是什么
What is the best way to use 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
之前被调用。
我希望第一个 lign 是 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
对于在我的第一行添加的每个字符,我可以看到我的第二行的一个字符正在被删除,我明白为什么但我找不到任何解决方案。
你们能帮帮我吗?
行为没有任何问题。
如果你在文件中间或不在末尾的某个地方写一个字符,你会覆盖那个位置的任何内容。
如果你想在其他地方写而不是最后(附加),你将不得不读取和写入你没有修改的文件部分。
此外,您可能想改用 std::ifstream
/ std::ofstream
/ std::fstream
。
fseek 主要用于在二进制文件中搜索 - C/C++ 中没有基于行的文件。
我知道您想追加一行,然后根据总行数更新第一行 - 我能看到的唯一可能性是使用 space/zero 来填充行数以确保它始终是相同的长度,即类似于:
fprintf(fichier, "%10ld \n", nombre_lignes);
我不确定所需的行为是否标准化。
我正在实习,正在做一个 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
之前被调用。
我希望第一个 lign 是 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
对于在我的第一行添加的每个字符,我可以看到我的第二行的一个字符正在被删除,我明白为什么但我找不到任何解决方案。
你们能帮帮我吗?
行为没有任何问题。
如果你在文件中间或不在末尾的某个地方写一个字符,你会覆盖那个位置的任何内容。
如果你想在其他地方写而不是最后(附加),你将不得不读取和写入你没有修改的文件部分。
此外,您可能想改用 std::ifstream
/ std::ofstream
/ std::fstream
。
fseek 主要用于在二进制文件中搜索 - C/C++ 中没有基于行的文件。
我知道您想追加一行,然后根据总行数更新第一行 - 我能看到的唯一可能性是使用 space/zero 来填充行数以确保它始终是相同的长度,即类似于:
fprintf(fichier, "%10ld \n", nombre_lignes);
我不确定所需的行为是否标准化。