2013-10-03 49 views
0

我必須使用3種不同的數據類型解析文本文件。我希望它被保存在一個有三個成員的結構數組中。我的文本文件是這樣的:將不同數據類型的文本文件放入結構數組中

A B 45.78965 
A C 35.46731 
B C 46.78695 

我正在閱讀的程序是以下,它不起作用。 我在做什麼錯?

#include <stdio.h> 

struct gra { 
    char from; 
    char to; 
    double w; 
}; 

int main() 
{ 
    FILE *fp = fopen("graph.txt", "r"); 
    int i = 0; 
    while (!feof(fp)) { 
     fscanf(fp, "%[^\t]", &graph[i].from, &graph[i].to, &graph[i].w); 
     i++; 
    } 
    fclose(fp); 
} 
+2

你不** **打印任何東西。所以沒有輸出。 –

+0

除了讀取文件並關閉之外,您的程序不會執行任何操作。你期望它做什麼? –

+0

好,那我該怎麼做?我只想將文件保存到數組中。 :( –

回答

2

你的一個問題是,你正在閱讀使用%[^\t],其內容爲字符串,並將結果保存到不是字符數組(兩個字符和一個雙)變量。

雖然從您的問題中不清楚,但您的輸入行看起來似乎包含兩個字符和一個由一個製表符分隔的實數。如果是這樣,你應該使用下列fscanf看他們:

fscanf(fp, "%c\t%c\t%lf\n", &graph[i].from, &graph[i].to, &graph[i].w); 

如果你不知道究竟分隔字段,並要允許和還額外空白之間的任意數量的空格開始和行結束,然後使用:

fscanf(fp, " %c %c%lf\n", &graph[i].from, &graph[i].to, &graph[i].w); 

也就是說,在格式中使用一個額外的空間,每個"%c"之前明確地跳過空白。

您的代碼也有一對夫婦的其他問題:

  1. 您正在使用feof檢查文件的末尾。如果您不是逐字讀取文件,這通常不會奏效。相反,你應該檢查你的fscanf是否返回3,也就是說,如果它成功讀取了你想要讀取的三件事情。

  2. 您錯過了array 的定義。

我加入了完整的代碼,我會做解析寫:

#include"stdio.h" 
#define MAX 100 

struct { 
    char from, to; 
    double w; 
} graph[MAX]; 

int main() 
{ 
    FILE *fp = fopen("graph.txt", "rt"); 
    for (int i=0; i<MAX; i++) 
    if (fscanf(fp, " %c %c%lf\n", &graph[i].from, &graph[i].to, &graph[i].w) < 3) 
     break; 
    fclose(fp); 
    return 0; 
} 
+0

是的,謝謝你的評論。我的問題是如何將這些數據類型保存到結構數組中?我可以使用函數printf(「%c%c%lf」,a.from,a.to,a.w)打印數據,但我無法將這些數據保存到我的數組中。我應該使用fget函數來讀取文本文件中的每個字符? –

+0

如果您使用正確的'fscanf',您將會將您的數據保存到您的陣列中。我將完整的代碼添加到我的答案中,以幫助您。 – nickie

+0

+1爲示例代碼。 – fayyazkl

相關問題