16

Im trying to copy a whole .txt file into a char array. My code works but it leaves out the white spaces. So for example if my .txt file reads "I Like Pie" and i copy it to myArray, if i cout my array using a for loop i get "ILikePie"

Here is my code

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () 
{
  int arraysize = 100000;
  char myArray[arraysize];
  char current_char;
  int num_characters = 0;
  int i = 0;

  ifstream myfile ("FileReadExample.cpp");

     if (myfile.is_open())
        {
          while ( !myfile.eof())
          {
                myfile >> myArray[i];
                i++;
                num_characters ++;
          }      

 for (int i = 0; i <= num_characters; i++)
      {

         cout << myArray[i];
      } 

      system("pause");
    }

any suggestions? :/

4

5 回答 5

48

myfile >> myArray[i]; 

您正在逐字阅读文件,这会导致跳过空格。

您可以将整个文件读入字符串

std::ifstream in("FileReadExample.cpp");
std::string contents((std::istreambuf_iterator<char>(in)), 
    std::istreambuf_iterator<char>());

然后你可以contents.c_str()用来获取 char 数组。

这是如何工作的

std::string具有范围构造函数,它复制范围 [first,last) 中的字符序列,注意它不会以相同的顺序复制 last :

template <class InputIterator>
  string  (InputIterator first, InputIterator last);

std::istreambuf_iteratoriterator 是输入迭代器,它从流缓冲区中读取连续的元素。

std::istreambuf_iterator<char>(in)

将为我们的ifstream in(文件开头)创建迭代器,如果您不将任何参数传递给构造函数,它将创建流结束迭代器(最后位置):

默认构造的 std::istreambuf_iterator 称为流结束迭代器。当一个有效的 std::istreambuf_iterator 到达底层流的末尾时,它变得等于流尾迭代器。取消引用或增加它会进一步调用未定义的行为。

因此,这将复制所有字符,从文件中的第一个字符开始,直到下一个字符是流的结尾。

于 2013-08-23T08:27:16.323 回答
14

使用以下代码片段:

FILE *f = fopen("textfile.txt", "rb");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);

char *string = (char *)malloc(fsize + 1);
fread(string, fsize, 1, f);
fclose(f);

string[fsize] = 0;
于 2013-08-23T09:00:31.857 回答
1

如果您一定要使用 char 数组,并且对代码进行最少的修改,这是一个简单的解决方案。下面的代码段将包含所有空格和换行符,直到文件末尾。

      while (!myfile.eof())
      {
            myfile.get(myArray[i]);
            i++;
            num_characters ++;
      }  
于 2015-06-06T01:44:40.090 回答
1

一个更简单的方法是使用 get() 成员函数:

while(!myfile.eof() && i < arraysize)
{
    myfile.get(array[i]); //reading single character from file to array
    i++;
}
于 2017-08-23T14:33:03.357 回答
1

这是您需要的代码片段:

#include <string>
#include <fstream>
#include <streambuf>
#include <iostream>


int main()
{
  std::ifstream file("name.txt");
  std::string str((std::istreambuf_iterator<char>(file)),
                        std::istreambuf_iterator<char>());

  str.c_str();

  for( unsigned int a = 0; a < sizeof(str)/sizeof(str[0]); a = a + 1 )
  {
    std::cout << str[a] << std::endl;
  }

  return 0;
}
于 2019-06-23T17:08:55.713 回答