2017-04-05 173 views
0

我正在使用C語言編寫並行openmp,並使用此代碼從.txt文件中讀取一百萬個數據。在C程序中讀取文件.txt

FILE *data = NULL; 
data = fopen("1millon.txt","r"); 

float ID, n, cord[1000000],cordy[1000000]; 
int ale = 1000000; 
for(i=0;i<ale;i++){ 

fscanf (data, "%f %f", &ID, &n); 
    cordx[i]=ID; 
    cordy[i]=n; 
} 

其實這個「的fscanf」做得很好,當我在我的正常的計算機上運行我的程序。但是如果我想在並行化集羣中運行它,它會向我顯示下一個警告(警告:忽略'fscanf'的返回值,用屬性warn_unused_result聲明返回值[-Wunused-result] fscanf(data,「%f %F 「& ID,& N); ) ,它不會跑。」

你知道另一種方式如何閱讀,而不是 「的fscanf」 .txt文件, 「FREAD」

謝謝

+0

1.「它不會工作」不是的情況充分說明。程序是否編譯或者沒有正確運行? 2. ID和n被聲明爲整數,但您的scanf將它們視爲浮點數。非常神奇,這在任何地方都很順利。你能添加cordx和cordy的定義嗎? – fvu

+0

不要將浮標讀入整數 - 它不會很好。 – ThingyWotsit

+1

printf()讀取它們時的ID和n。這是一種「標準」測試/調試檢查。除非你做這些事情,或者使用實際的調試器,否則你不會進步。 – ThingyWotsit

回答

1

fscanf()返回的東西。 o幫助您發現問題和特殊情況。您的羣集被配置爲抱怨。你自己的電腦不是這樣配置的,因此它不會警告。

爲了避免集羣上的警告,請不要忽略返回值。即檢查你是否成功匹配。

或者(void) fsanf...告訴編譯器「我故意忽略有用的返回值。」。

按照opengroup fscanf manpages,你應該期待您來fscanf呼叫(將返回值部分中)返回2時,它的成功在讀你的兩個float值:

成功完成後,這些功能返回成功匹配和分配的輸入項目的數量;如果提前匹配失敗,此數字可以爲0。

如果返回少於兩個,額外的工作將被要求拋棄錯誤的輸入(見下面對於這方面的一個很好的例子),退出該處理或以其它方式以某種其它方式處理該錯誤。否則,您未來撥打fscanf的電話將失敗,原因是從stdin未讀的相同垃圾。

if (fscanf(data, "%f %f", &ID, &n) != 2) { 
    fscanf(data, "%*[^\n]"); // read and discard up to the next newline character 
    fgetc(data);    // ... and discard the newline character, too 
    /* XXX: What to do with cordx[i] and cordy[i]? */ 
} 
+0

@Seb謝謝,好的附加信息。 (而且它可能以我的方式贏得了一些聲譽。) – Yunnosch

+0

你的回答很好,足以在我的書中賺取剔號;沒有重寫它來添加細節。另外,我並不需要代表。我在追逐徽章atm;) – Sebivor