2010-06-20 187 views
14

經過詳盡的谷歌搜索和訪問很多論壇,我還沒有找到一個很好的綜合答案這個問題。很多論壇建議使用獲取線 istream& getline (char* s, streamsize n)函數。我的問題是如果我不知道每條線的長度是多少,並且無法預測可能的尺寸是多少?在C中它又是什麼?如何從c/C++中的文本文件讀取一行?

c/C++中是否有任何特定的函數每次從文本文件讀取一行?

解釋,使用代碼片段將幫助我很多。

+1

這不是一個DUP,因爲它特別要求關於C ,而假設的'dup'具體是在問C++。 – sje397 2013-06-01 00:55:43

+0

@sje這個問題也說C++也... – 2013-06-01 01:10:28

+1

@DannyBeckett是的,我注意到了。我認爲這與我的觀點不相關,因爲這個(不像其他人)詢問C,這使得它在質量上有所不同。 – sje397 2013-06-02 07:50:51

回答

18

在c中,你可以使用fopen和getch。通常,如果您不能確切確定最長行的長度,您可以分配一個大緩衝區(例如8kb),並幾乎可以保證獲取所有行。

如果有機會,你可能真的很長,你必須逐行處理,你可以malloc一個合理的緩衝區,並使用realloc每次你接近填充它的大小加倍。

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

void handle_line(char *line) { 
    printf("%s", line); 
} 

int main(int argc, char *argv[]) { 
    int size = 1024, pos; 
    int c; 
    char *buffer = (char *)malloc(size); 

    FILE *f = fopen("myfile.txt", "r"); 
    if(f) { 
     do { // read all lines in file 
     pos = 0; 
     do{ // read one line 
      c = fgetc(f); 
      if(c != EOF) buffer[pos++] = (char)c; 
      if(pos >= size - 1) { // increase buffer length - leave room for 0 
      size *=2; 
      buffer = (char*)realloc(buffer, size); 
      } 
     }while(c != EOF && c != '\n'); 
     buffer[pos] = 0; 
     // line is now in buffer 
     handle_line(buffer); 
     } while(c != EOF); 
     fclose(f);   
    } 
    free(buffer); 
    return 0; 
} 
+1

char c; ??? !!! close(f)??和malloc.h !!!不是stdlib.h – Nyan 2010-06-21 04:38:40

+0

@Nyan - 歡呼,修正 – sje397 2010-06-21 04:56:51

3

getline()是你在找什麼。您在C++中使用字符串,並且您不需要提前知道大小。

假設STD命名空間:

ifstream file1("myfile.txt"); 
string stuff; 

while (getline(file1, stuff, '\n')) { 
     cout << stuff << endl; 
} 

file1.close(); 
+0

注意:你需要'std :: getline(std :: istream&,std :: string&)'而不是'std :: istream :: getline'。 – 2010-06-20 23:25:37

+2

我們如何在C中做到這一點? – 2010-06-20 23:30:29

22

在C++中,你可以使用全局函數的std ::函數getline,它需要一個字符串和流和一個可選的分隔符,讀取1號線,直到達到指定的分隔。舉例:

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

int main() { 
    std::ifstream input("filename.txt"); 
    std::string line; 

    while(std::getline(input, line)) { 
     std::cout<<line<<'\n'; 
    } 

    return 0; 
} 

該程序從文件讀取每一行並將其回顯到控制檯。

對於C你可能正在尋找使用fgets,它已經有一段時間,因爲我用C,這意味着我有點生疏,但我相信你可以用它來模擬上述C++程序的功能,如所以:

#include <stdio.h> 

int main() { 
    char line[1024]; 
    FILE *fp = fopen("filename.txt","r"); 

    //Checks if file is empty 
    if(fp == NULL) {      
     return 1; 
    } 

    while(fgets(line,1024,fp)) { 
     printf("%s\n",line); 
    } 

    return 0; 
} 

由於限制條件不能超過您正在讀取的緩衝區的最大長度。

+0

謝謝。我們如何在C中做同樣的事情?任何的? – 2010-06-20 23:30:55

+0

更新了我的帖子,回憶了我的做法,我希望它是正確的,否則我會糾正帖子,一旦人們指出我做錯了什麼。 – Jacob 2010-06-20 23:38:46

+0

謝謝,我想知道是否有比使用固定長度的緩衝區更好的方法。我想我現在知道我們需要硬編碼緩衝區大小。 – 2010-06-20 23:40:26

7

在C中,fgets(),並且您需要知道最大大小以防止截斷。

+0

這是C的最佳答案,它應該有更多upvotes。 (實際上'getline'更好,但非標準。) – 2015-01-25 18:33:51

4

我不是真的那麼好,在C,但我相信這代碼應該給你完整的單行至死不渝......

#include<stdio.h> 

int main() 
{  
    char line[1024];  
    FILE *f=fopen("filename.txt","r");  
    fscanf(*f,"%[^\n]",line);  
    printf("%s",line);  
}  
+1

你應該避免'fscanf',因爲它會導致緩衝區溢出。它現在提供了將輸入大小限制爲正在寫入的緩衝區大小的方法(這裏是'line')。 – 2015-01-25 18:28:08