C:fprintf不工作
我有一个很长的C代码。开始时,我打开了两个文件并在上面写了一些东西:C:fprintf不工作,c,file,printf,C,File,Printf,我有一个很长的C代码。开始时,我打开了两个文件并在上面写了一些东西: ffitness_data = fopen("fitness_data.txt","w"); if( ffitness_data == NULL){ printf("Impossible to open the fitness data file\n"); exit(1); }else{ fprintf(ffitness_data,"#This file contains all the d
ffitness_data = fopen("fitness_data.txt","w");
if( ffitness_data == NULL){
printf("Impossible to open the fitness data file\n");
exit(1);
}else{
fprintf(ffitness_data,"#This file contains all the data that are function of fitness.\n");
fprintf(ffitness_data,"#Columns: f,<p>(f),<l>(f).\n\n");
}
fmeme_data = fopen("meme_data.txt","w");
if( fmeme_data == NULL){
printf("Impossible to open the meme data file\n");
exit(1);
}else{
fprintf(fmeme_data,"#This file contains all the data relative to memes.\n");
fprintf(fmeme_data,"#Columns: fitness, popularity, lifetime.\n\n");
}
ffitness_data=fopen(“fitness_data.txt”,“w”);
if(FFI\U数据==NULL){
printf(“无法打开健身数据文件\n”);
出口(1);
}否则{
fprintf(fitness#u data,“#此文件包含所有与fitness有关的数据。\n”);
fprintf(ffitness#u data,“#列:f,(f),(f)。\n\n”);
}
fmeme_data=fopen(“meme_data.txt”,“w”);
if(fmeme_data==NULL){
printf(“无法打开meme数据文件”);
出口(1);
}否则{
fprintf(fmeme#u data,“#此文件包含与模因相关的所有数据。\n”);
fprintf(fmeme#U数据,“#列:适合度、流行度、寿命。\n\n”);
}
这一步一切都很好:文件是打开的,上面写着两行
然后我对一个随机过程进行了长时间的模拟,其代码对于问题的目的来说并不有趣:文件及其指针从未被使用过。在流程结束时,我有:
for(i=0;i<data;i++){
fprintf(fmeme_data,"%f\t%d\t%f\n",meme[i].fitness,meme[i].popularity,meme[i].lifetime);
}
for(i=0;i<40;i++){
fprintf(ffitness_data,"%f\t%f\t%f\n",(1.0/40)*(i+0.5),popularity_histo[i],lifetime_histo[i]);
}
for(i=0;i我们无法确定这里发生了什么,因为我们没有您的完整程序,也无法访问发生问题的服务器。但是,我们可以给您一些调试建议
- 当一个C程序在一台计算机上的行为与另一台计算机上的行为不同时,您首先应该怀疑的是内存损坏。查找内存损坏的最佳可用工具是。修复它报告的第一个无效操作并重复,直到它不再报告任何无效操作。出现此问题的可能性很大然后就走了
- 尽可能提高警告级别,解决所有投诉,甚至那些看起来很愚蠢的投诉
- 您说您正在调用
fflush
和fclose
,但您是否正在检查它们是否失败?请仔细检查,如下所示:
if (ferror(ffitness_data) || fflush(ffitness_data) || fclose(ffitness_data)) {
perror("write error on fitness_data.txt");
exit(1);
}
- 如果您更改编译时使用的优化级别,问题是否会消失?如果是,您可能有一个导致“未定义行为”的bug。不幸的是,有很多可能的方法可以做到这一点,我无法轻松解释如何查找它们
- 使用一个工具,比如把你的程序简化成一个较小的程序,它仍然不能正常工作,但是足够短,可以完整地发布在这里
- 阅读并遵循文章“”中的说明
我们无法确定这里发生了什么,因为我们没有您的完整程序,也没有访问发生问题的服务器的权限。但是,我们可以给您一些调试建议
- 当一个C程序在一台计算机上的行为与另一台计算机上的行为不同时,您首先应该怀疑的是内存损坏。查找内存损坏的最佳可用工具是。修复它报告的第一个无效操作并重复,直到它不再报告任何无效操作。出现此问题的可能性很大然后就走了
- 尽可能提高警告级别,解决所有投诉,甚至那些看起来很愚蠢的投诉
- 您说您正在调用
fflush
和fclose
,但您是否正在检查它们是否失败?请仔细检查,如下所示:
if (ferror(ffitness_data) || fflush(ffitness_data) || fclose(ffitness_data)) {
perror("write error on fitness_data.txt");
exit(1);
}
- 如果您更改编译时使用的优化级别,问题是否会消失?如果是,您可能有一个导致“未定义行为”的bug。不幸的是,有很多可能的方法可以做到这一点,我无法轻松解释如何查找它们
- 使用一个工具,比如把你的程序简化成一个较小的程序,它仍然不能正常工作,但是足够短,可以完整地发布在这里
- 阅读并遵循文章“”中的说明
展示一些。您应该阅读的文档,并检查其故障。在服务器上,您可能使用与笔记本电脑不同的权限运行程序。最后,您的问题是操作系统特定的。在笔记本电脑上的
valgrind
下运行该程序,以排除内存损坏。顺便说一句,编译您自己的代码,其中包含所有警告和错误调试信息(例如,gcc-Wall-Wextra-g
with…)。然后-即使在服务器上。对于问题而言,其代码不感兴趣,可能会发生非感兴趣代码中的某些溢出会破坏您的文件句柄,因此,fprintf
无法工作…不同的机器,不同的条件…@Danielnotarmuzi:我已经写下了原因。如果没有其他人要求的“我说你调用了未定义的行为。我们既不是透视者,也不是调试服务。如果你不提供所需的信息,就仅此而已。将来:学习使用调试器。展示一些。你应该阅读文档,并检查其故障。在服务器上,你可能会使用不同的权限运行你的程序。”n在笔记本电脑上。最后,你的问题是操作系统特定的。在笔记本电脑上运行valgrind
下的程序以排除内存损坏。顺便说一句,用所有警告和调试信息编译你自己的代码(例如,gcc-Wall-Wextra-g
with…)。然后-即使在服务器上。对于问题而言,其代码不感兴趣,可能会发生非感兴趣代码中的某些溢出会破坏您的文件句柄,因此,fprintf
无法工作…不同的机器,不同的条件…@Danielnotarmuzi:我已经写下了原因。如果没有其他人要求的我说你调用了未定义的行为。我们既不是透视者,也不是调试服务。如果你不提供所需的信息,就这样。将来:学会使用调试器。