我想从C或C ++中的文件中逐行读取,并且当我假设某个行的固定大小时,我知道如何做到这一点,但是有一种简单的方法可以以某种方式计算或获得所需的确切大小对于一行或文件中的所有行? (如果任何人都可以这样做,那么逐字逐句阅读,直到换行也对我有好处。)
答案 0 :(得分:7)
如果您使用流媒体阅读器,则所有这些都将对您隐藏。见getline
。以下示例基于代码here。
// 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";
}
答案 1 :(得分:4)
在C中,如果您有POSIX 2008库(例如,更新版本的Linux),则可以使用POSIX getline()
函数。如果你的库中没有这个功能,你可以很容易地实现它,这可能比发明你自己的界面来完成这项工作更好。
在C ++中,您可以使用std::getline()
。
即使两个函数具有相同的基本名称,调用约定和语义也大不相同(因为C和C ++语言完全不同) - 除了它们都从文件流中读取一行数据,当然
没有一种简单的方法可以判断文件中最长行的大小 - 除非通过读取整个文件来查找,这有点浪费。
答案 2 :(得分:3)
我会使用IFStream并使用getline从文件中读取。
http://www.cplusplus.com/doc/tutorial/files/
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;
}
答案 3 :(得分:1)
在阅读之前,您无法获得行的长度。但是,您可以反复读入缓冲区,直到到达行尾。
对于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;
}
答案 4 :(得分:0)
在C ++中,您可以使用std::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);
答案 5 :(得分:0)
getline只是POSIX,这里是ANSI( NO 最大行大小信息需要!):
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和Unix文本文件的Windows, 它适用于Unix for Unix和Windows-textfiles
答案 6 :(得分:0)
这是一种使用std算法和迭代器读取行的C ++方法:
#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));
}