2016-09-14 46 views
2

我在C语言中编程经验有限,但由于软件限制,必须使用此语言。我正在尝试为CFD软件编写用户定制。如何从.txt文件中读取最后3个变量值,使用C

软件在计算过程中写入输出文件,我想监视变量“PERCENT FILLED”并在值稳定时终止模拟。我可以做代码的终止,我遇到的问题是使用C读取PERCENT FILLED的值,我可以很容易地在python或shell脚本中执行此操作,但是我真的在C中挣扎。

可能有这是一个非常优雅的方式,我很高兴学习,但我不是一个有经验的程序员,所以我可能会因为复杂的解决方案而迷失方向。

我试图通过将任务分解为更小的子任务来做到这一点。代码的效率并不重要,因为此函数不必频繁运行,并且要读取的文件不是很大。我相信有这样做更快,更优雅的方式! 从网络使用其他代码并修改它们我已经拿出了下面的代码。

我试着做下面的子任务: A)剥去含有“PERCENT装”的所有行,并将它们写入文件(百分比FILLED.txt) B)阅读本文件的行数,然后读最后3行分成不同的变量。 C)然后我需要重新格式化这些变量。例如,将3个变量从“PERCENT FILLED = 6.72902E + 00”形式的字符串更改为诸如6.72902等值的浮点数。

我已经完成了A),在B)中有错误,并且无法确定从哪里开始C)。

B)中的错误 - 当我运行代码时,它正确地为while循环中的line1,line2和line3赋值,但是一旦在while循环外,所有值都变为line1的值。这我不明白。任何人都可以帮我理解并解决这个问题吗

示例代码输出:

line3: PERCENT FILLED = 6.31275E+00 
line2: PERCENT FILLED = 6.50146E+00 
line1: PERCENT FILLED = 6.72902E+00 
****************** 
out line1: PERCENT FILLED = 6.72902E+00 
out line2: PERCENT FILLED = 6.72902E+00 
out line3: PERCENT FILLED = 6.72902E+00 

C部分) - 我不知道从哪里开始与此有关。它看起来有足够的信息内联使用atof()将字符串转换为浮点数。但是,我首先需要从字符串的起始处删除PERCENT FILLED =,然后转换工程编号格式(某些值为1.00E + 02,因此仅删除最后4个字符--E + 00 - 将不起作用)。这我不知道该怎么做。任何帮助,将不胜感激。

实施例输入文件(通过去除PERCENT填充的值之间可能线而简化):

Step = 171 Iteration = 0 Time step = 0.014849 Time = 4.834002 
    Iter Variable Solver Loops   Delta  Solve CPU  Form CPU 
    0  F EXPLC  4 1.0000000E+00  0.007999  0.000000 
FRACTION SOLID = 0.000000e+00 % 
PERCENT FILLED = 5.46882E+00 
    Step = 172 Iteration = 0 Time step = 0.029698 Time = 4.863700 
    Iter Variable Solver Loops   Delta  Solve CPU  Form CPU 
    0  F EXPLC 11 1.0000000E+00  0.018997  0.000000 
FRACTION SOLID = 0.000000e+00 % 
PERCENT FILLED = 5.70902E+00 
    Step = 173 Iteration = 0 Time step = 0.029698 Time = 4.893398 
    Time step reduced by COURANT limit in free_surface, c_lim = 2.032750e-02 
    Iter Variable Solver Loops   Delta  Solve CPU  Form CPU 
    0  F EXPLC  6 1.0000000E+00  0.010998  0.000000 
FRACTION SOLID = 0.000000e+00 % 
PERCENT FILLED = 5.89665E+00 
    Step = 174 Iteration = 0 Time step = 0.020328 Time = 4.904356 
    Iter Variable Solver Loops   Delta  Solve CPU  Form CPU 
    0  F EXPLC  7 1.0000000E+00  0.011997  0.000000 
FRACTION SOLID = 0.000000e+00 % 
PERCENT FILLED = 6.08026E+00 
    Step = 175 Iteration = 0 Time step = 0.040655 Time = 4.945011 
    Time step reduced by COURANT limit in free_surface, c_lim = 2.547617e-02 
    Iter Variable Solver Loops   Delta  Solve CPU  Form CPU 
    0  F EXPLC  9 1.0000000E+00  0.016998  0.000000 
FRACTION SOLID = 0.000000e+00 % 
PERCENT FILLED = 6.31275E+00 
    Step = 176 Iteration = 0 Time step = 0.025476 Time = 4.955307 
    Time step reduced by COURANT limit in free_surface, c_lim = 1.997734e-02 
    Iter Variable Solver Loops   Delta  Solve CPU  Form CPU 
    0  F EXPLC  9 1.0000000E+00  0.016994  0.000000 
FRACTION SOLID = 0.000000e+00 % 
PERCENT FILLED = 6.50146E+00 
    Step = 177 Iteration = 0 Time step = 0.039955 Time = 4.989764 
    Time step reduced by COURANT limit in free_surface, c_lim = 2.547537e-02 
    Iter Variable Solver Loops   Delta  Solve CPU  Form CPU 
    0  F EXPLC 13 1.0000000E+00  0.024994  0.000000 
FRACTION SOLID = 0.000000e+00 % 
PERCENT FILLED = 6.72902E+00 

我当前的代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char line[1000]; 
    char *pch; 
    char c[] = "PERCENT FILLED ="; 
    char buff[1000]; 


/* Create a list of PERCENT FILLED values and write to file - copy every line containing PERCENT FILLED from p.out file*/ 
    FILE *fp = fopen("inputFILE.txt", "r"); 
    FILE *op = fopen("PERCENT_FILLED.txt", "w"); 

    if(fp == NULL || op == NULL) 
     { 
      fprintf(stderr, "Error opening file."); 
      exit(1); 
     } 
    else 
     { 
     while (fgets(line, sizeof(line), fp) != 0) 
      { 
       if((pch = strstr (line, c))!= 0) 
       fprintf(op, "%s", line); 
      } 
     } 

    fclose(fp); 
    fclose(op); 


/* Get the total number of lines in the file PERCENT_FILLED.txt */ 

    FILE* myfile = fopen("PERCENT_FILLED.txt", "r"); 
    int ch, number_of_lines = 0; 
    int line_num = 0; 
    int count = 0; 
    char readline[256];        /* or other suitable maximum line size */ 
    char* line1; 
    char* line2; 
    char* line3; 

    do 
    { 
     ch = fgetc(myfile); 
     if(ch == '\n') 
      number_of_lines++; 
    } while (ch != EOF); 

    // last line doesn't end with a new line! 
    // but there has to be a line at least before the last line 
    if(ch != '\n' && number_of_lines != 0) 
     number_of_lines++; 

    fclose(myfile); 




/* Get the last 3 PERCENT_FILLED values from the PERCENT_FILLED.txt */ 


    FILE* infile = fopen("PERCENT_FILLED.txt", "r"); 

    if (infile != NULL) 
    { 
     while (fgets(readline, sizeof line, infile) != NULL) /* read a line */ 
     { 
      if (count == (number_of_lines-4)) 
      { 
       line3 = readline; 
       count++; 
       printf("\nline3:%s", line3); 
      } 
      else if (count == (number_of_lines-3)) 
      { 
       line2 = readline; 
       count++; 
       printf("line2:%s", line2); 
      } 
      else if (count == (number_of_lines-2)) 
      { 
       line1 = readline; 
       count++; 
       printf("line1:%s", line1); 
      } 
      else 
      { 
       count++; 
       printf("readline:%s count:%d\n", readline, count); 
      } 
     } 
     fclose(infile); 
    } 
    printf("******************\n"); 
    printf("out line1:%s", line1); 
    printf("out line2:%s", line2); 
    printf("out line3:%s\n\n", line3); 


/* strip "PERCENT FILLED = " from the string and turn the string into a float */ 
/* Do this for line1, line2, line3 */ 
/* Example string is " PERCENT FILLED = 6.72902E+00" need to turn this in to a float variable of value 6.72902 */ 

    return 0; 

} 
+2

见'人sscanf',从字符串读取,让您将通过一个格式说明和可变的数据等,然后格式化从变量的输出。 – KevinDTimm

回答

1

感谢您的帮助,我的代码现在作为工作如下所示。我确信有这样一种更加优雅的方式,但为了完整起见,我会提供我的最终代码以防万一。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char line[1000]; 
    char *pch; 
    char c[] = "PERCENT FILLED ="; 
    char buff[1000]; 


/* Create a list of PERCENT FILLED values and write to file - copy every line containing PERCENT FILLED from p.out file*/ 
    FILE *fp = fopen("inputFILE.txt", "r"); 
    FILE *op = fopen("PERCENT_FILLED.txt", "w"); 

    if(fp == NULL || op == NULL) 
     { 
      fprintf(stderr, "Error opening file."); 
      exit(1); 
     } 
    else 
     { 
     while (fgets(line, sizeof(line), fp) != 0) 
      { 
       if((pch = strstr (line, c))!= 0) 
       fprintf(op, "%s", line); 
      } 
     } 

    fclose(fp); 
    fclose(op); 


/* Get the total number of lines in the file PERCENT_FILLED.txt */ 

    FILE* myfile = fopen("PERCENT_FILLED.txt", "r"); 
    int ch, number_of_lines = 0; 
    int line_num = 0; 
    int count = 0; 
    char readline[256];        /* or other suitable maximum line size */ 
    char line1[256]; 
    char line2[256]; 
    char line3[256]; 

    do 
    { 
     ch = fgetc(myfile); 
     if(ch == '\n') 
      number_of_lines++; 
    } while (ch != EOF); 

    // last line doesn't end with a new line! 
    // but there has to be a line at least before the last line 
    if(ch != '\n' && number_of_lines != 0) 
     number_of_lines++; 

    fclose(myfile); 




/* Get the last 3 PERCENT_FILLED values from the PERCENT_FILLED.txt */ 


    FILE* infile = fopen("PERCENT_FILLED.txt", "r"); 

    if (infile != NULL) 
    { 
     while (fgets(readline, sizeof line, infile) != NULL) /* read a line */ 
     { 
      if (count == (number_of_lines-4)) 
      { 
       strcpy (line3, readline); 
       count++; 
      } 
      else if (count == (number_of_lines-3)) 
      { 
       strcpy (line2, readline); 
       count++; 
      } 
      else if (count == (number_of_lines-2)) 
      { 
       strcpy (line1, readline); 
       count++; 
      } 
      else 
      { 
       count++; 
      } 
     } 
     fclose(infile); 
    }  

/* strip "PERCENT FILLED = " from the string and turn the string into a float */ 
/* Do this for line1, line2, line3 */ 
/* Example string is " PERCENT FILLED = 6.72902E+00" need to turn this in to a float varaible of value 6.72902 */ 

    char per1[7], fil1[6], eq1[1]; 
    char per2[7], fil2[6], eq2[1]; 
    char per3[7], fil3[6], eq3[1]; 
    float value1, value2, value3; 

    sscanf (line1, "%s %s %s %E", per1, fil1, eq1, &value1); 
    sscanf (line2, "%s %s %s %E", per2, fil2, eq2, &value2); 
    sscanf (line3, "%s %s %s %E", per3, fil3, eq3, &value3); 

    printf("Value1: %f\n", value1); 
    printf("Value2: %f\n", value2);  
    printf("Value3: %f\n", value3); 


    return 0; 

    }