在 C 中写入多个文件,遍历它们的名称
write multiple files in C iterating over their names
我正在尝试通过迭代、进行一些计算并将索引添加到文件名来编写一堆文件,这是我的部分代码(我强调了代码停止编译的地方):
float AltAzCalc(int d, float t, float Lon, float RA, float Dec, float Lat){
FILE *in;
-----> char filename[30] = ("hiparcos_horizontal_%lf_%lf.csv",Lon,Lat);
in = fopen(filename, "w");
float PI = 3.14159265;// pi
float G = 6.5949997;
float Alt , Az;
float GST = G + 0.0657098244*d + 1.00273791*t;
if (GST > 24){
GST = GST - 24;
}
float LST = GST*360/24 + Lon;
Alt = (180/PI)*(asin(sin(PI*Dec/180)*sin(PI*Lat/180) + cos(PI*Dec/180)*cos(PI*Lat/180)*cos(PI*(LST-RA*360/24)/180)));
if(sin(PI*(LST-RA*360/24)/180) <= 0){
Az = (180/PI)*(acos((sin(PI*Dec/180)-(sin(PI*Alt/180)*sin(PI*Lat/180)))/(cos(PI*Alt/180)*cos(PI*Lat/180))));
}else{
Az = 360 - (180/PI)*(acos((sin(PI*Dec/180)-(sin(PI*Alt/180)*sin(PI*Lat/180)))/(cos(PI*Alt/180)*cos(PI*Lat/180))));
}
fprintf(in," %lf %lf \n",Alt,Az);
}
int main{
for(int i = -180 ; i < 181 ; i++){
for(int j = -180 ; j < 181 ; j++){
for(int k = 0; k < 119616 ; k++){
AltAzCalc(97,9.2,i,AscensionRecta.array[k],Declinacion.array[k],j);
}
}
}
}
我之前使用过这样的语法,只是没有添加任何我想更改的额外数字,这是一个字符串文字,这就是它所要求的,知道如何解决这个问题吗?
两件大事:
char filename[30]
可能维度太小,无法容纳名称。
- 您需要使用
sprintf()
/snprintf()
生成文件名。
值得一提的是,%f
足够了,建议打印一个浮点值。
做类似的事情(伪代码)
char filename[128] = {0}; //allocate enough memory
sprintf(filename, "hiparcos_horizontal_%f_%f.csv",Lon,Lat)); //Added missing semi-colon // use %f, that's enough and recommended, too.
注意:在使用 returned 文件指针之前,请始终检查 fopen()
的 return 值是否成功。
如果你想要格式化字符串,使用snprintf:
char filename[30];
snprintf(filename, sizeof filename, "hiparcos_horizontal_%f_%f.csv", Lon, Lat);
和 %f
而不是 %lf
来打印 float
.
另请注意(正如@SouravGhosh 所指出的)[30]
太小而无法隐藏整个文件名。
这里是用括号括起来的逗号表达式。它包含三个子表达式——一个字符串和两个float
变量——从左到右依次为'calculated',然后最后一个子表达式的结果成为整个paren的结果。因此,正如编译器所说,字符串和 Lon
变量的结果(在本例中为值)未被使用。那么 Lat
的结果不适合初始化一个 char
数组。
编译器不知道你想要一个格式化的字符串,你需要明确地写它,正如其他人所说:首先你需要为你的文件名准备一个足够长的缓冲区:
char filename[66];
然后用数据填充它:
sprintf(filename, "hiparcos_horizontal_%lf_%lf.csv", Lon, Lat);
格式字符串本身包含 25 个普通字符。假设 Lon
和 Lat
都将转换为不超过 20 个字符(但使用 sprintf
描述验证!)总文件名不应超过 65 个字符。为 NUL 终止符添加一个,声明中的大小为 66。
哦,完成写入后不要忘记 fclose
文件!
我正在尝试通过迭代、进行一些计算并将索引添加到文件名来编写一堆文件,这是我的部分代码(我强调了代码停止编译的地方):
float AltAzCalc(int d, float t, float Lon, float RA, float Dec, float Lat){
FILE *in;
-----> char filename[30] = ("hiparcos_horizontal_%lf_%lf.csv",Lon,Lat);
in = fopen(filename, "w");
float PI = 3.14159265;// pi
float G = 6.5949997;
float Alt , Az;
float GST = G + 0.0657098244*d + 1.00273791*t;
if (GST > 24){
GST = GST - 24;
}
float LST = GST*360/24 + Lon;
Alt = (180/PI)*(asin(sin(PI*Dec/180)*sin(PI*Lat/180) + cos(PI*Dec/180)*cos(PI*Lat/180)*cos(PI*(LST-RA*360/24)/180)));
if(sin(PI*(LST-RA*360/24)/180) <= 0){
Az = (180/PI)*(acos((sin(PI*Dec/180)-(sin(PI*Alt/180)*sin(PI*Lat/180)))/(cos(PI*Alt/180)*cos(PI*Lat/180))));
}else{
Az = 360 - (180/PI)*(acos((sin(PI*Dec/180)-(sin(PI*Alt/180)*sin(PI*Lat/180)))/(cos(PI*Alt/180)*cos(PI*Lat/180))));
}
fprintf(in," %lf %lf \n",Alt,Az);
}
int main{
for(int i = -180 ; i < 181 ; i++){
for(int j = -180 ; j < 181 ; j++){
for(int k = 0; k < 119616 ; k++){
AltAzCalc(97,9.2,i,AscensionRecta.array[k],Declinacion.array[k],j);
}
}
}
}
我之前使用过这样的语法,只是没有添加任何我想更改的额外数字,这是一个字符串文字,这就是它所要求的,知道如何解决这个问题吗?
两件大事:
char filename[30]
可能维度太小,无法容纳名称。- 您需要使用
sprintf()
/snprintf()
生成文件名。
值得一提的是,%f
足够了,建议打印一个浮点值。
做类似的事情(伪代码)
char filename[128] = {0}; //allocate enough memory
sprintf(filename, "hiparcos_horizontal_%f_%f.csv",Lon,Lat)); //Added missing semi-colon // use %f, that's enough and recommended, too.
注意:在使用 returned 文件指针之前,请始终检查 fopen()
的 return 值是否成功。
如果你想要格式化字符串,使用snprintf:
char filename[30];
snprintf(filename, sizeof filename, "hiparcos_horizontal_%f_%f.csv", Lon, Lat);
和 %f
而不是 %lf
来打印 float
.
另请注意(正如@SouravGhosh 所指出的)[30]
太小而无法隐藏整个文件名。
这里是用括号括起来的逗号表达式。它包含三个子表达式——一个字符串和两个float
变量——从左到右依次为'calculated',然后最后一个子表达式的结果成为整个paren的结果。因此,正如编译器所说,字符串和 Lon
变量的结果(在本例中为值)未被使用。那么 Lat
的结果不适合初始化一个 char
数组。
编译器不知道你想要一个格式化的字符串,你需要明确地写它,正如其他人所说:首先你需要为你的文件名准备一个足够长的缓冲区:
char filename[66];
然后用数据填充它:
sprintf(filename, "hiparcos_horizontal_%lf_%lf.csv", Lon, Lat);
格式字符串本身包含 25 个普通字符。假设 Lon
和 Lat
都将转换为不超过 20 个字符(但使用 sprintf
描述验证!)总文件名不应超过 65 个字符。为 NUL 终止符添加一个,声明中的大小为 66。
哦,完成写入后不要忘记 fclose
文件!