2016-01-05 84 views
0

我的意圖是獲取文件multiples.txt上存在的所有數字,並寫出所需整數的倍數(由用戶輸入)。從文件中獲取倍數並在另一個文件上覆制

#include <stdio.h> 
int main() { 
    FILE *f, *fs; 
    int value, multiple, n; 

    f = fopen("multiples.txt", "r"); 

    if (f == NULL) 
     printf("Error\n"); 

    fs = fopen("exit.txt", "w"); 

    if (fs == NULL) 
     printf("Error\n"); 

    printf("Write a number\n"); 
    scanf("%d", &value); 

    do { 
     n = fscanf(f, "%d", multiple); 

     if (multiple % value == 0) { 
      fprintf(fs, "%d", multiple); 
     } 

    } while (n != EOF); 

    fclose(f); 
    fclose(fs); 
} 

我的程序崩潰,我無法確定它來自哪裏。

回答

0
n=fscanf(f, "%d", multiple); 

我認爲這點有一個小問題

n=fscanf(f, "%d", &multiple); 

添加 「&」

+1

此外,fscanf在文件結束時不返回EOF。它返回匹配元素的數量。 –

+0

我認爲fscanf會返回你得到的數量。 我推薦你 while(fscanf(f,「%d」,&multiple)== 1){//你想要什麼。 } :) – arubirate

+0

請參閱http://www.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf並返回值部分 – arubirate

2

如果你只是啓用警告(-Wall對於初學者),編譯器只是告訴你

​​

你忘了採取的multiple

地址始終使用工具來發現你的錯誤

有跡象表明,可以用一趟文檔許多亟待解決的其他問題(例如, http://linux.die.net/man/3/scanf

3

我要承擔原標籤實際上是正確的,並給出一個答案是(我認爲)更好地利用C++的能力,而不是僅僅C.

既然我們要複製符合特定標準的項目,我們可以使用std::copy_if算法來處理大部分工作。我們還需要爲要複製的項目指定「規則」。我們通常希望使用流而不是C風格FILE *,特別是因爲後者不支持迭代器。

考慮這些想法進去,我們會寫代碼更是這樣的:

#include <iostream> 
#include <algorithm> 
#include <fstream> 
#include <iterator> 

int main() { 
    std::ifstream in("multiples.txt"); 
    std::ofstream out("exit.txt"); 

    std::cout << "Enter a number: "; 
    int n; 
    std::cin >> n; 

    std::istream_iterator<int> begin(in), end; 

    std::copy_if(begin, end, 
     std::ostream_iterator<int>(out), 
     [n](int i) { return i % n == 0; }); 
} 

正如你所看到的,這消除了錯誤最初促使問題的機會(有錯誤你一起不正確地處理文件的結尾)。

如果您要在C中完成這項工作,您通常需要將讀取輸入與測試結合起來,以確定輸入是否成功,以獲得讀取到文件末尾的循環,然後在正確的時間停止。在這種情況下你與fscanf,這樣一個很容易的方式閱讀,正確地寫入循環將類似於:

while (1 == fscanf(f, "%d", &multiple)) 
    if (multiple % value == 0) 
     fprintf(fs, "%d", multiple); 

fscanf返回的值是一個「項目」成功轉換次數。在這裏,我們要求讀取/轉換一個整數,然後測試是否發生了這種情況。

一個小小的增加(適用於兩者):我已經編寫了上面的代碼,以便在一個方面與問題中的代碼相匹配:它將結果數字寫出來,而不會在它們之間有任何分隔符。例如,如果您有一個包含2 4 5 8的輸入並且用戶輸入了2,則它將產生248的輸出,因此在結果中,您將無法分辨哪些數字來自哪些輸入。在實際使用中,你幾乎肯定希望用某些東西(逗號,空格,換行符等)將它們分開。

相關問題