在C中写入多个文件,迭代它们的名称

时间:2015-02-20 06:25:31

标签: c string for-loop printf

我试图通过迭代,进行一些计算并将索引添加到文件的名称来编写一堆文件,这是我代码的一部分(我强调了代码停止编译的地方):

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);



            }

         }
    }
}

我之前使用过这样的语法只是没有添加任何我想要更改的额外数字,这是一个字符串文字,这是它的要求,还有任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

两件大事:

  1. char filename[30]的尺寸可能太小而不能保留名称。
  2. 您需要使用sprintf()/snprintf()生成文件名。
  3. 值得一提的是,%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.
    

    注意:在使用返回的文件指针之前,请务必检查fopen()的返回值是否成功。

答案 1 :(得分:1)

如果您需要格式化字符串,请使用snprintf

char filename[30];

snprintf(filename, sizeof filename, "hiparcos_horizontal_%f_%f.csv", Lon, Lat);

%f代替%lf来打印float

另请注意(正如@SouravGhosh指出的那样)[30]太小而无法隐藏整个文件名。

答案 2 :(得分:1)

你在这里有一个括在括号中的逗号表达式。它包含三个子表达式 - 一个字符串和两个float变量 - 从左到右在odrer中“计算”,然后最后一个子表达式的结果成为整个paren的结果。因此,正如编译器所说,字符串和Lon变量的结果(在这种情况下为值)仍未使用。然后,Lat的结果不适合初始化char数组。

编译器不知道你想要一个格式化的字符串,你需要明确地写它,正如其他人所说:首先你需要为你的文件名准备一个足够长的缓冲区:

char filename[66];

然后用数据填充:

sprintf(filename, "hiparcos_horizontal_%lf_%lf.csv", Lon, Lat);

格式化字符串本身包含25个普通字符。假设LonLat都将转换为每个不超过20个字符(但使用sprintf说明验证!)总文件名不应超过65个字符。为NUL终结符添加一个,并且在声明中大小为66。

哦,写完文件后不要忘记fclose文件!