2011-10-08 3 views
0

에있는 파일에서 다른 행에서이 개 값은 그때 가치를 빼기 그때 각 행의 두 번째 값을 읽을 수있는 방법을할 방법 읽고 빼기 C

19.39825343760206 , -99.20035242455288 
19.402068553663323, -99.18884038346096 
19.412830341813137, -99.18181299584194 
19.420813944440887, -99.17626082318111 
19.421929492669275, -99.17060940878673 
19.423626831405098, -99.16279076950832 
19.42586547013487, -99.15465428846164 
19.427341437102363, -99.14900153296276 
19.42677988826859, -99.14223767237945 
19.426539585246708, -99.13745395260139 
19.425789584581995, -99.13291163163467 
19.42548983629902, -99.12465713339134 
19.428912245829306, -99.11943755464836 
19.430273095215284, -99.11480135636612 
19.42715425437469, -99.10933367328926 
19.423242338939442, -99.10226739363952 

같은 txt 파일이

(-99.20035242455288) - (-99.18884038346096) 
(-99.18884038346096) - (-99.18181299584194) 
(-99.18181299584194) - (-99.17626082318111) 
... 
(-99.10933367328926) - (-99.10226739363952) 
?? 

내가 또한 다음하지만 두 번째 행의 첫 번째 값과 그 값을 유지하는 방법을 모른다 .... 같은 기능을하고 있었다 : 다음 행은 다음과 같이 인쇄 할 내가 두 번째 값을 원한다는 것을 C에게 알려주는 방법 (쉼표로 구분)

void read_second_value (const char* file_name) 
{ 
    FILE* file = fopen (file_name, "r"); 
    double i  = 0; 
    double i_plus_1 = 0; 
    fscanf (file, "%f", &i);  

    while (!feof (file)) 
    { 
     printf ("%f ", i); 
     fscanf (file, "%f", &i);  
    } 
    fclose (file);   
} 

하지만 내가 같은 솔루션을 시도 :

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char* file_name = "C:\\test.txt"; 
    FILE* fp = NULL; 
    double left_value, right_value = 0.0, prev_value = 0.0; 

    if ((fp = fopen (file_name, "r")) == NULL) { 
    printf ("FILE OPEN ERROR: %d\n", errno); 
    exit (1); 
    } 
    if (fscanf (fp, "%lf, %lf", &left_value, &right_value) != 2) 
    printf ("WARNING: failed to read two values...\n"); 
    else 
    printf ("left_value: %lf, right_value: %lf ", left_value, right_value); 
    while (!feof (fp)) 
    { 
     prev_value = right_value; 
     if (fscanf (fp, "%lf, %lf", &left_value, &right_value) != 2) 
     printf ("WARNING: failed to read two values...\n"); 
     else { 
     printf ("left_value: %lf, right_value: %lf ", left_value, right_value); 
     printf ("%lf - %lf = %lf\n", prev_value, right_value, prev_value - left_value); 
     } 
    } 
    fclose (fp); 
    return 0; 
} 

을하지만 무한

경고를 얻을 : 두 개의 값을 ... 읽지 못했습니다

답변

1

라인 :

GOOD : xxx.00, yyy.00 BAD : xxx.00, yyy.00

#include <stdio.h> 
#include <errno.h> 

int 
main (int argc, char *argv[]) 
{ 
    FILE* fp = NULL; 
    int ct = 0; 
    double left_value, right_value = 0.0, prev_value = 0.0; 

    if (argc != 2) { 
    printf ("USAGE: %s <filename>\n", argv[0]); 
    return 1; 
    } 

    if ((fp = fopen (argv[1], "r")) == NULL) { 
    printf ("FILE OPEN ERROR: %d\n", errno); 
    return 1; 
    } 

    ct = fscanf (fp, "%lf, %lf", &left_value, &right_value); 
    if (ct != 2) { 
    printf ("WARNING: failed to read two values...\n"); 
    return 1; 
    } 

    while (!feof (fp)) { 
     prev_value = right_value; 
     ct = fscanf (fp, "%lf, %lf", &left_value, &right_value); 
     if (ct == 0) { 
     printf ("End of file...\n"); 
     } 
     else if (ct != 2) { 
     printf ("WARNING: failed to read two values...\n"); 
     } 
     else { 
     printf ("left_value: %lf, right_value: %lf ", 
      left_value, right_value); 
     printf ("%lf - %lf = %lf\n", 
      prev_value, right_value, prev_value - left_value); 
     } 
    } 
    printf ("Closing file...\n"); 
    fclose (fp); 
    return 0; 
} 

첫 번째 행은 제 번호 뒤에 "공간 콤마 공간"을 갖는다; 모든 나머지 줄에는 "쉼표 - 공백"이 있습니다.

"scanf"를 사용하려면 일관된 데이터 세트가 있어야합니다. 당신은보다 강력한 분석을 원하는 경우에

는, 당신은해야합니다

1) "는 fgets()"각 라인

2)와 같은 기능을 사용하여 "하면 strchr()"(선호) 또는 "strok() "(사용되지 않음) 개별 토큰 (행당 3 개 토큰 : 첫 번째 숫자, 쉼표 및 두 번째 숫자)을 구문 분석합니다.

1

방법에 대한 다음과 같은 내용 :

void read_values (const char* file_name) 
{ 
    FILE* fp = NULL; 
    double left_value, right_value = 0.0, prev_value = 0.0; 

    if ((fp = fopen (file_name, "r")) == NULL) { 
    printf ("FILE OPEN ERROR: %d\n", errno); 
    exit (1); 
    } 
    if (fscanf (fp, "%lf, %lf", &left_value, &right_value) != 2) 
    printf ("WARNING: failed to read two values...\n"); 
    else 
    printf ("left_value: %lf, right_value: %lf ", left_value, right_value); 
    while (!feof (fp)) 
    { 
     prev_value = right_value; 
     if (fscanf (fp, "%lf, %lf", &left_value, &right_value) != 2) 
     printf ("WARNING: failed to read two values...\n"); 
     else { 
     printf ("left_value: %lf, right_value: %lf ", left_value, right_value); 
     printf ("%lf - %lf = %lf\n", prev_value, right_value, prev_value - left_value); 
     } 
    } 
    fclose (fp);   
} 

PS : 나는이 하지 ... 컴파일 또는 테스트 ...하지만 난 당신에게 유용 희망

이 샘플 코드는 한 첫 번째 수정으로 ... 작동
+0

해결책을 찾지 못했지만 '경고 : 두 개의 값을 읽지 못했습니다.'라는 메시지가 표시됩니다. – cMinor