C ++:抓取文件的每个字符,忽略换行符和空格

时间:2012-04-19 18:16:42

标签: c++ arrays char

所以这看起来像是一个简单的问题,但我正在努力解决它。我有一个大文件,我想要通过并将文件中的每个字符串放入一个char数组。我的问题是我不知道如何处理换行符和任何空格。有没有办法只是浏览文件并获取所有字符,跳过换行符,并将它们放在一个数组中?

是的,我在google上搜索过但没有运气。

4 个答案:

答案 0 :(得分:1)

以下是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):

答案 1 :(得分:1)

首选方法是使用标准库字符串。从字符串here中删除空格的示例。如何逐行读取文件here

示例代码:

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;
}

此代码未经测试。

答案 2 :(得分:1)

在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;
}

我更喜欢标准算法来手工制作循环。以下是使用std::copy在C ++中执行此操作的一种方法。请注意,这种方式和第一种方式几乎相同。

#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::accumulatestd::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;
}

答案 3 :(得分:0)

fgets允许您读取直到换行符(注意换行符仍然存在于目标缓冲区中,因此请确保用'\ 0'覆盖它。)
逐行读取文件,每次将输出与前一个输出连接起来。