所以这似乎是一个如此简单的问题,但我正在努力解决它。我有一个大文件,我想通过它并将文件中的每个字符放入一个字符数组中。我的问题是我不知道如何处理换行符和任何空格。有没有办法只通过文件并获取所有字符,跳过换行符并将它们放入数组中?
是的,我在谷歌上搜索过,但没有运气。
这是在C
. 我相信它也可以使用C++
接口来完成,但是 C 库也是 C++ 的一部分。
#include <stdio.h>
#include <ctype.h>
FILE *f = fopen ("filename", "r");
if (!f)
error ...
char array [BIGENOUGH];
int index = 0;
while (!feof (f))
{
char c = fgetc (f);
if (!isspace (c))
array [index++] = c;
}
fclose (f):
首选方法是使用标准库字符串。从此处的字符串中删除空格的示例。如何在此处逐行读取文件。
示例代码:
fstream file;
file.open("test.txt",ios::in);
while ( !file.eof() ) {
string str;
file >> str;
remove_if(str.begin(), str.end(), isspace);
str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
//save str here
}
file.close();
remove_if
示例实现:
template<typename T, typename P>
T remove_if(T beg, T end, P pred)
{
T dest = beg;
for (T itr = beg;itr != end; ++itr)
if (!pred(*itr))
*(dest++) = *itr;
return dest;
}
此代码未经测试。
在 C++ 中做你想做的事的关键是利用格式化的输入操作。你想忽略空格;格式化的输入法正是这样做的。
这是使用规范 C++ 输入循环的一种方法:
#include <fstream>
#include <iostream>
int main () {
std::ifstream inFile("input.txt");
char c;
std::string result;
while(inFile >> c)
result.push_back(c);
std::cout << result;
}
我更喜欢标准算法而不是手工制作的循环。这是在 C++ 中使用std::copy
. 请注意,这种方式和第一种方式几乎相同。
#include <vector>
#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>
int main () {
std::ifstream inFile("input.txt");
std::string result;
std::copy(std::istream_iterator<char>(inFile),
std::istream_iterator<char>(),
std::back_inserter(result));
std::cout << result;
}
另一种方式,这次使用std::accumulate
. std::accumulate
使用operator+
代替push_back
,因此我们可以一次读取文件string
。
#include <vector>
#include <fstream>
#include <numeric>
#include <iostream>
#include <iterator>
#include <algorithm>
int main () {
std::ifstream inFile("input.txt");
std::string result =
std::accumulate(
std::istream_iterator<std::string>(inFile),
std::istream_iterator<std::string>(),
std::string());
std::cout << result;
}
fgets
允许您读取直到换行符(请注意换行符仍然存在于目标缓冲区中,因此请确保用 '\0' 覆盖它)。
逐行读取文件,每次将您的输出与前一个输出连接起来。