C++ ifstream 行尾
c++ ifstream end of line
我有一个如下所示的文件:
e r g d g d
f h d r h f
..........
而我想把这些字符存储在一个二维数组中
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream file("file.txt");
char c[20][20];
int i = 0, j = 0;
while(!file.eof())
{
while(!end of line?)
{
file >> c[i][j];
j++;
}
i++;
}
.....
}
我该怎么做?
或者如何查找一行中的字符数?
您不能像现在这样使用 eof()
。您必须先执行 I/O 读取操作,然后才能使用 eof()
.
对于你正在尝试的,你应该使用 std::getline()
来代替,例如:
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <algorithm>
int main()
{
std::ifstream file("file.txt");
std::string line;
char c[20][20] = {};
for (int i = 0; i < 20; ++i)
{
if (!std::getline(file, line))
break;
std::istringstream iss(line);
for(j = 0; j < 20; ++j)
{
if (!(iss >> c[i][j]))
break;
}
}
...
return 0;
}
也就是说,您应该考虑使用 std::vector
而不是固定大小的数组(除非您知道您的文件 永远不会 超过 20 行 and/or 每行20个字符):
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <vector>
int main()
{
std::ifstream file("file.txt");
std::vector<std::vector<char> > c;
std::string line;
while (std::getline(file, line))
{
std::istringstream iss(line);
std::vector<char> tmp;
std::copy(
std::istream_iterator<char>(iss),
std::istream_iterator<char>(),
std::back_inserter(tmp)
);
/* which is equivalent to:
char ch;
while (iss >> ch) {
tmp.push_back(ch);
}
*/
c.push_back(tmp);
}
...
return 0;
}
或者:
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <vector>
typedef std::vector<char> CharVector;
std::istream& operator>>(std::istream &in, CharVector &out)
{
out.clear();
std::string line;
if (std::getline(in, line))
{
std::istringstream iss(line);
std::copy(
std::istream_iterator<char>(iss),
std::istream_iterator<char>(),
std::back_inserter(out)
);
/* which is equivalent to:
char ch;
while (iss >> ch) {
out.push_back(ch);
}
*/
}
return in;
}
int main()
{
std::ifstream file("file.txt");
std::vector<CharVector> c;
std::copy(
std::istream_iterator<CharVector>(file),
std::istream_iterator<CharVector>(),
std::back_inserter(c)
);
/* which is equivalent to:
CharVector cv;
while (file >> cv) {
c.push_back(cv);
}
*/
...
return 0;
}
我有一个如下所示的文件:
e r g d g d
f h d r h f
..........
而我想把这些字符存储在一个二维数组中
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream file("file.txt");
char c[20][20];
int i = 0, j = 0;
while(!file.eof())
{
while(!end of line?)
{
file >> c[i][j];
j++;
}
i++;
}
.....
}
我该怎么做?
或者如何查找一行中的字符数?
您不能像现在这样使用 eof()
。您必须先执行 I/O 读取操作,然后才能使用 eof()
.
对于你正在尝试的,你应该使用 std::getline()
来代替,例如:
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <algorithm>
int main()
{
std::ifstream file("file.txt");
std::string line;
char c[20][20] = {};
for (int i = 0; i < 20; ++i)
{
if (!std::getline(file, line))
break;
std::istringstream iss(line);
for(j = 0; j < 20; ++j)
{
if (!(iss >> c[i][j]))
break;
}
}
...
return 0;
}
也就是说,您应该考虑使用 std::vector
而不是固定大小的数组(除非您知道您的文件 永远不会 超过 20 行 and/or 每行20个字符):
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <vector>
int main()
{
std::ifstream file("file.txt");
std::vector<std::vector<char> > c;
std::string line;
while (std::getline(file, line))
{
std::istringstream iss(line);
std::vector<char> tmp;
std::copy(
std::istream_iterator<char>(iss),
std::istream_iterator<char>(),
std::back_inserter(tmp)
);
/* which is equivalent to:
char ch;
while (iss >> ch) {
tmp.push_back(ch);
}
*/
c.push_back(tmp);
}
...
return 0;
}
或者:
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <vector>
typedef std::vector<char> CharVector;
std::istream& operator>>(std::istream &in, CharVector &out)
{
out.clear();
std::string line;
if (std::getline(in, line))
{
std::istringstream iss(line);
std::copy(
std::istream_iterator<char>(iss),
std::istream_iterator<char>(),
std::back_inserter(out)
);
/* which is equivalent to:
char ch;
while (iss >> ch) {
out.push_back(ch);
}
*/
}
return in;
}
int main()
{
std::ifstream file("file.txt");
std::vector<CharVector> c;
std::copy(
std::istream_iterator<CharVector>(file),
std::istream_iterator<CharVector>(),
std::back_inserter(c)
);
/* which is equivalent to:
CharVector cv;
while (file >> cv) {
c.push_back(cv);
}
*/
...
return 0;
}