如何从c/C++中的文本文件读取一行?

问题描述:

经过详尽的谷歌搜索和访问很多论坛,我还没有找到一个很好的综合答案这个问题。很多论坛建议使用获取线 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

在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

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

在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

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

+0

这是C的最佳答案,它应该有更多upvotes。 (实际上'getline'更好,但非标准。) – 2015-01-25 18:33:51

我不是真的那么好,在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