2017-02-20 18 views
1

.dat 파일이 계속 업데이트되고 있습니다. 파일의 최신 줄에서 데이터를 가져 오려고합니다. 그러나 나는 부정확 한 결과를 얻는다. 여기에 MYFILE.DAT입니다 :fseek 및 fscan은 C++에서 .DAT 파일의 잘못된 결과를 나타냅니다.

# Time forces(pressure, viscous) moment(pressure, viscous) 
0.005 (((2 10 4) (3 6 0)) ((12 60 -13) (4.88 0.5 -0.32))) 
0.01 (((2 20 2) (4 7 3)) ((0.0024 1 -70) (40 6000 -1200))) 

그리고 여기에 C++ 코드 :

Here is f_total = 0 N 

은 분명히 잘못 여기

#include <iostream> 
#include <fstream> 
#include <string> 

int main() 
{ 
    FILE * force; 
    force = fopen("file.dat", "r"); 
    float timestep; 
    float fxp; 
    float fyp; 
    float fzp; 
    float fxv; 
    float fyv; 
    float fzv; 
    float mxp; 
    float myp; 
    float mzp; 
    float mxv; 
    float myv; 
    float mzv; 

    char c; 

    fseek(force,-285,SEEK_END); 

    while(c != '\n') 
    { 
    c = fgetc(force); 
    } 

    fscanf(force, "%f ((%f %f %f) (%f %f %f)) ((%f %f %f) (%f %f %f))", &timestep, &fxp, &fyp, &fzp, &fxv, &fyv, &fzv, &mxp, &myp, &mzp, &mxv, &myv, &mzv); 

    fclose(force); 

    float ftotal = fxp + fxv; 

    std::cout << "Here is f_total = " << ftotal << " N" << std::endl; 

    return 0; 
} 

그리고 결과입니다.

"%f ((%f %f %f) (%f %f %f)) ((%f %f %f) (%f %f %f))" 

하지만해야한다 :

"%f (((%f %f %f) (%f %f %f)) ((%f %f %f) (%f %f %f)))" 

편집 :이 가장 가능성이되지는 2 + 4 = 6

+0

파일의 "최신 행"은 무엇입니까? 지속적으로 업데이트되고 있습니까? –

+0

Funny'#include '그리고 당신은'std :: * fstream' 클래스를 사용하지 않습니다. – WhiZTiM

+0

파일을 읽을 때 파일이 쓰여지고 있다면, 마지막 줄은 완성되지 않았을 것입니다. 그것의 일부가 완충되었다. – Barmar

답변

1

귀하의 fscanf 형식 문자열이 있어야합니다 가장 좋은 방법은 (2 등 뒤로, 1 앞으로)이 변경으로 작동하는지 확인하십시오 :

fseek(force, -1, SEEK_END); 

while (c != '\n') 
{ 
    c = fgetc(force); 
    fseek(force, -2, SEEK_CUR); 
} 
+0

감사합니다. 나는 시도했다. 그러나 그것은 나에게 '여기 f_total = 5 N'을 줬다. 그것은 6이어야합니다. –

+0

그것은 저에게 6을주고 정확히 같은 내용으로 그 .dat 파일을 만들었습니다. 여기에 게시 한 코드를 컴파일하고 게시 된 내용으로 새 파일을 만든 다음 다시 시도하십시오. – mpiatek

+0

새로운 .dat 및 C++ 코드를 만들었습니다. 결과는 여전히 5입니다. 심지어 파일의 값을 변경했습니다. 항상 5를줍니다. –

0

1 fscanf는 검사 한 필드 수를 반환하므로 "int n = fscanf (....")을 추가 한 다음 "n"이 있어야한다고 생각하는지 확인하십시오. 이것은 당신에게 많은 머리를 긁적 줄 수 있습니다.

2 : 마지막부터 탐색 할 때 줄 길이를 가정하는 것보다 파일 시작 부분에서 \ n을 스캔 한 다음 fscanf를 수행하기 전에 마지막으로 다시 탐색하는 것이 좋습니다. 이렇게하면 특정 파일을 쉽게 선택할 수 있습니다. 줄 번호. 다음은 전체 파일을 검색 한 다음 마지막 행으로 되돌아갑니다 (파일에 \ n이 마지막 문자로 없다고 가정).

+0

감사합니다. 나는 당신의 코드를 문제와 결합시켰다. 이제 얻을 수 있습니다 4 줄, pos = 182 여기에 f_total = 0 N 그런데 말씀 드렸듯이, 여기에있는 실제 문제는 -285를 정의하는 것입니다. 나는이 숫자를 -65로 시도했지만 아무런 문제가 없었다. 그것은 나에게 정확한 답을 주었다. 나는 해결책을 찾고 나중에 여기에서보고하려고 노력할 것이다. –