2009-11-17 69 views
1

我試圖一次輸出一行文件中的文本。我目前硬編碼和我有這個至今:從文件一次輸出一行

int main(int argc, char *argv[]) 
{ 
    int x; 
    int k; 
    int limit = 5; 
    FILE *file; 

    file = fopen("C:\\Documents and Settings\\jon\\My Documents\\Visual Studio 2008\\Projects\\Project1\\Assignment8_2\\Debug\\TestFile1.txt", "r"); 
    if (file == NULL) { 
     perror("Error"); 
    } 

    for (k = 1; k <= limit; k++) { 
     while ((x = fgetc(file)) != '\n') { 
      printf("%c", x); 
     } 
    } 
    fclose(file); 
} 

我在那裏在上面的代碼,不知道是否在所有的,我可以檢查EOF。我想我需要這樣做,但不知道爲什麼。仍在學習......謝謝!

回答

2

也許你可以試試這個:

#include <iostream> 
#include <iomanip> 
#include <fstream> 
using namespace std; 

int main() { 
    int sum = 0; 
    int x; 
    ifstream inFile; 

    inFile.open("test.txt"); 
    if (!inFile) { 
     cout << "Unable to open file"; 
     exit(1); // terminate with error 
    } 

    while (inFile >> x) { 
     sum = sum + x; 
    } 

    inFile.close(); 
    cout << "Sum = " << sum << endl; 
    return 0; 
} 
+0

+1肯定C++的方式做到這一點,可以使用ifstream in(「filename」);如果(!in.is_open())返回0; ...' – stefanB 2009-11-17 06:21:31

+0

一次一行,而不是一次一個整數。 – DevSolar 2009-11-17 06:49:09

-1

你應該從fgetc輸出檢查EOF:

... 
x = fgetc(file); 
while (x != '\n' && x != EOF) { 
... 

fgetc手冊有

+0

一次一行,而不是一次一個字符。 – DevSolar 2009-11-17 06:58:08

+0

和?我們只是檢查eof不會改變任何東西... – RageZ 2009-11-17 07:05:44

5

如果你能約束的最大長度一行,fgets可能是更好的方式來讀取每一行;但是既然你提到了C++,你可能會考慮使用getline(注意:fgets也會把\n放在它填充的緩衝區中,getline不會)。兩者都易於檢查文件的結尾(fgets在eof上返回NULL,getline在它的istream參數上設置eofbit,它也返回)。

2

fgets() for C,getline() for C++。

C:

#include <stdio.h> 
#include <stdlib.h> 

// adjust as appropriate 
size_t const MAX_LINE_LENGTH = 1024; 

int main() 
{ 
    FILE * in; 
    char line[ MAX_LINE_LENGTH ]; 
    if ((in = fopen("test.txt", "r")) == NULL) 
    { 
     puts("Failed to open test.txt."); 
     return EXIT_FAILURE; 
    } 
    while (fgets(line, MAX_LINE_LENGTH, in) != NULL) 
    { 
     printf("%s", line); 
    } 
    fclose(in); 
    return EXIT_SUCCESS; 
} 

C++:

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

int main() 
{ 
    std::ifstream in("test.txt"); 
    std::string line; 
    while (getline(in, line)) 
    { 
     std::cout << line << std::endl; 
    } 
    in.close(); 
    return 0; 
} 
+0

除非您想檢查錯誤或捕獲並處理異常,否則不需要顯式調用close()。否則,讓RAII發揮它的魔力。 – 2009-11-17 08:18:44

+0

不*必要*,但好的樣式恕我直言。如果用在更大的功能上,它清楚地表明'in'已被處理,不會再被使用。如果你喜歡,叫我肛門保留。 ;-) – DevSolar 2009-11-17 10:44:40

+0

對於乾淨的C++示例+1。這是這個線程中最簡單的例子。 雖然我會忽略close()調用。它是多餘的,因此鍋爐板。 RAII應該在這裏工作得很好。 – 2009-11-17 12:02:35

0

你可以調用FEOF()來檢查EOF或檢查的龜etc返回代碼()EOF相匹配。

我加入這兩個版本的代碼雖然我不知道什麼是循環(尤其是外部的)都應該做的,但你的樣本的範圍內,EOF檢查應該是這樣..

/* EOF would now terminate both loops, using feof() and fgetc() return to check EOF */ 
for (k = 1; k <= limit && !feof(file); k++) { 
    while ((x = fgetc(file))!='\n' && x!=EOF) { 
      printf("%c", x); 
    } 
}