如何从c/C++中的文本文件读取一行?
经过详尽的谷歌搜索和访问很多论坛,我还没有找到一个很好的综合答案这个问题。很多论坛建议使用获取线 istream& getline (char* s, streamsize n)
函数。我的问题是如果我不知道每条线的长度是多少,并且无法预测可能的尺寸是多少?在C中它又是什么?如何从c/C++中的文本文件读取一行?
c/C++中是否有任何特定的函数每次从文本文件读取一行?
解释,使用代码片段将帮助我很多。
在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;
}
getline()
是你在找什么。您在C++中使用字符串,并且您不需要提前知道大小。
假设STD命名空间:
ifstream file1("myfile.txt");
string stuff;
while (getline(file1, stuff, '\n')) {
cout << stuff << endl;
}
file1.close();
注意:你需要'std :: getline(std :: istream&,std :: string&)'而不是'std :: istream :: getline'。 – 2010-06-20 23:25:37
我们如何在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;
}
由于限制条件不能超过您正在读取的缓冲区的最大长度。
谢谢。我们如何在C中做同样的事情?任何的? – 2010-06-20 23:30:55
更新了我的帖子,回忆了我的做法,我希望它是正确的,否则我会纠正帖子,一旦人们指出我做错了什么。 – Jacob 2010-06-20 23:38:46
谢谢,我想知道是否有比使用固定长度的缓冲区更好的方法。我想我现在知道我们需要硬编码缓冲区大小。 – 2010-06-20 23:40:26
在C中,fgets(),并且您需要知道最大大小以防止截断。
这是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);
}
你应该避免'fscanf',因为它会导致缓冲区溢出。它现在提供了将输入大小限制为正在写入的缓冲区大小的方法(这里是'line')。 – 2015-01-25 18:28:08
这不是一个DUP,因为它特别要求关于C ,而假设的'dup'具体是在问C++。 – sje397 2013-06-01 00:55:43
@sje这个问题也说C++也... – 2013-06-01 01:10:28
@DannyBeckett是的,我注意到了。我认为这与我的观点不相关,因为这个(不像其他人)询问C,这使得它在质量上有所不同。 – sje397 2013-06-02 07:50:51