2014-09-24 96 views
2

我使用兩個函數從文件中讀取雙精度(read_double)和整數(read_integer)。 文件格式是如下在不包括字符()的用fscanf讀取文件的下一行()

12345678 (ID) 
3.78  (GPA) 
3   (Year) 
20.5  (Age) 

有文件中的這些條目5被讀取。

#include <stdio.h> 

double read_double(FILE *infile) 
{ 
    double double1=0.0; 
    fscanf(infile, "%lf",&double1); 
    return double1; 
} 

int read_integer(FILE *infile) 
{ 
    int int1=0; 
    fscanf(infile, "%d",&int1); 
    return int1; 

} 

int main(void) 
{ 
    FILE *inp,*outp; 
    double gpa1=0.0; 
    int id1=0; 
    inp=fopen("input.txt","r"); 
    outp=fopen("output.txt","w"); 
    id1=read_integer(inp); 
    gpa1=read_double(inp); 
    printf("%d, %.2lf",id1,gpa1); 
    return 0; 
} 

當這段代碼運行時,它打印的學號是12345678,然後打印1.00。這是因爲它再次讀取ID。

我怎麼會做出這種讀取第二行並返回GPA(3.78)

我需要讓main是在一個文件分割程序,以及其他功能上的另一個。請注意:我將不得不這樣做5次我們還沒有「學習while語句或」gets()「,所以請儘量不要使用這些或更復雜的方法。

+2

該代碼在我的電腦上正常工作。我刪除了未使用的變量(並刪除了'output.txt'這一行,但它並沒有被使用),它編譯時沒有錯誤或警告,即使使用'-Wall',打印12345678,然後打印3.78。我在Linux上使用gcc 4.9.1。 – Jay 2014-09-24 19:08:45

+1

@Jay這是當你從頭文件調用read_integer()和read_double()嗎? – user3482104 2014-09-24 19:12:45

+0

我不明白你的意思...什麼頭文件? :-)我編譯它,然後將這些值放在一個名爲'input.txt'的文件中並運行它。結果是正確的。 – Jay 2014-09-24 19:14:49

回答

2

根據評論,你想要的是分割程序庫和main。 所以,該庫將有兩個功能:

/* lib.c */ 
#include <stdio.h> 

double read_double(FILE *infile) 
{ 
    double double1=0.0; 
    fscanf(infile, "%lf",&double1); 
    return double1; 
} 

int read_integer(FILE *infile) 
{ 
    int int1=0; 
    fscanf(infile, "%d",&int1); 
    return int1; 

} 

頭文件將幫助使用你的庫知道從功能上會發生什麼(應該使用什麼類型的參數和返回值)的程序它只包含原型,而不是實際的功能定義:

/* lib.h */ 
#include <stdio.h> 

double read_double(FILE *infile); 
int read_integer(FILE *infile); 

及主要用途他們:

/* main.c */ 
#include <stdio.h> 
#include "lib.h" /* <== here! use the prototypes so 
          the compiler will know that 
          read_double returns double! */ 

int main(void) 
{ 
    FILE *inp; 
    double gpa1=0.0; 
    int id1=0; 
    inp=fopen("input.txt","r"); 
    id1=read_integer(inp); 
    gpa1=read_double(inp); 
    printf("%d, %.2lf",id1,gpa1); 
    return 0; 
} 

並進行編譯:

gcc lib.c main.c -o program 

現在,輸入文件是:

12345678 
3.78 
3 
20.5 

我們運行程序:

現在

如果我們從主

#include <stdio.h> 

int main(void) 
{ 
    FILE *inp; 
    double gpa1=0.0; 
    int id1=0; 
    inp=fopen("input.txt","r"); 
    id1=read_integer(inp); 
    gpa1=read_double(inp); 
    printf("%d, %.2lf",id1,gpa1); 
    return 0; 
} 

刪除#include "lib.h"與優化編譯它,

gcc -O3 lib.c main.c 

那麼結果是錯誤的:

./program 

12345678, 1.0 

因爲編譯器生成的代碼假設所有函數返回整數。在內部,雙打和整數的表現方式完全不同。

+1

我收到一個錯誤,說「棧周圍的變量int1已損壞」然後返回 - 1073741824,3.78。 – user3482104 2014-09-24 19:55:34

+0

你甚至會用* #include「lib.h」行得到這個錯誤嗎?你使用什麼系統和編譯器?你如何編譯? – Jay 2014-09-24 20:05:51

+1

找到了!打印它作爲longfloat而不是int – user3482104 2014-09-24 20:12:50