我想在C或C++中逐行读取文件,当我假设一行有固定的大小时,我知道如何做到这一点,但是是否有一种简单的方法来计算或获取每行或整个文件所需的确切大小?(如果有人能够逐字读取直到换行符,那也对我有好处。)
我想在C或C++中逐行读取文件,当我假设一行有固定的大小时,我知道如何做到这一点,但是是否有一种简单的方法来计算或获取每行或整个文件所需的确切大小?(如果有人能够逐字读取直到换行符,那也对我有好处。)
getline
。以下示例基于此处的代码。// getline with strings
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
string str;
ifstream ifs("data.txt");
getline (ifs,str);
cout << "first line of the file is " << str << ".\n";
}
cin
可以完全被文件流替换;无论如何,cin
都可以从文件重定向。 - Jonathan Lefflergetline()
函数。如果你的库中没有这个函数,你可以很容易地实现它,这可能比发明自己的接口更好。std::getline()
。int main () {
string line;
ifstream myfile ("example.txt");
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
cout << line << endl;
}
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
while (getline(stream, line)) { ... }
,然后如果您关心的话,可以在循环外检查终止的原因... - Tony Delroy在读取完一行之前,您无法获得该行的长度。但是,您可以重复地读入缓冲区,直到达到行末。
对于使用C语言编程,请尝试使用fgets来读取一行代码。它将读取n个字符或遇到换行符停止。您可以读取一个大小为n的小缓冲区,直到字符串中的最后一个字符是换行符。
有关更多信息,请参见上面的链接。
以下是使用小缓冲区读取并显示文件的整行的示例:
#include <stdio.h>
#include <string.h>
int main()
{
FILE * pFile;
const int n = 5;
char mystring [n];
int lineLength = 0;
pFile = fopen ("myfile.txt" , "r");
if (pFile == NULL)
{
perror ("Error opening file");
}
else
{
do
{
fgets (mystring , n , pFile);
puts (mystring);
lineLength += strlen(mystring);
} while(mystring[strlen ( mystring)-1] != '\n' && !feof(pFile));
fclose (pFile);
}
printf("Line Length: %d\n", lineLength);
return 0;
}
fgets()
的结果在未检查是否成功读取一行的情况下被使用。另外,请注意 puts()
在每次调用后输出一个换行符 — 因此它将长输入行分割成多个单独的输出行。 - Jonathan Lefflerstd::getline
函数,它接受一个流并读取到第一个'\n'
字符。在C语言中,我会使用fgets
函数,并不断重新分配缓冲区,直到最后一个字符是'\n'
,然后我们就知道已经读取了整行。
C++:
std::ifstream file("myfile.txt");
std::string line;
std::getline(file, line);
std::cout << line;
C:
// I didn't test this code I just made it off the top of my head.
FILE* file = fopen("myfile.txt", "r");
size_t cap = 256;
size_t len = 0;
char* line = malloc(cap);
for (;;) {
fgets(&line[len], cap - len, file);
len = strlen(line);
if (line[len-1] != '\n' && !feof(file)) {
cap <<= 1;
line = realloc(line, cap);
} else {
break;
}
}
printf("%s", line);
getline 只是 POSIX 标准,这里提供一个 ANSI 标准的实现(不需要最大行大小信息!):
const char* getline(FILE *f,char **r)
{
char t[100];
if( feof(f) )
return 0;
**r=0;
while( fgets(t,100,f) )
{
char *p=strchr(t,'\n');
if( p )
{
*p=0;
if( (p=strchr(t,'\r')) ) *p=0;
*r=realloc(*r,strlen(*r)+1+strlen(t));
strcat(*r,t);
return *r;
}
else
{
if( (p=strchr(t,'\r')) ) *p=0;
*r=realloc(*r,strlen(*r)+1+strlen(t));
strcat(*r,t);
}
}
return feof(f)?(**r?*r:0):*r;
}
现在,在你的主程序中,这变得简单而且短小:
char *line,*buffer = malloc(100);
FILE *f=fopen("yourfile.txt","rb");
if( !f ) return;
setvbuf(f,0,_IOLBF,4096);
while( (line=getline(f,&buffer)) )
puts(line);
fclose(f);
free(buffer);
它可以在Windows上运行,适用于Windows和Unix文本文件, 它可以在Unix上运行,适用于Unix和Windows文本文件
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
struct getline :
public std::iterator<std::input_iterator_tag, std::string>
{
std::istream* in;
std::string line;
getline(std::istream& in) : in(&in) {
++*this;
}
getline() : in(0) {
}
getline& operator++() {
if(in && !std::getline(*in, line)) in = 0;
}
std::string operator*() const {
return line;
}
bool operator!=(const getline& rhs) const {
return !in != !rhs.in;
}
};
int main() {
std::vector<std::string> v;
std::copy(getline(std::cin), getline(), std::back_inserter(v));
}