Не могу скопировать весь текстовый файл в массив символов - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь скопировать весь текстовый файл в массив char с помощью fstream, но даже при увеличении размера массива он читает текстовый файл до того же предела. Я стараюсь сохранить его в массиве char, и это будет хорошоесли это не динамический ???любое решение, пожалуйста ...

 // smallGrams.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
#include<iostream>
using namespace std;
#include<string>
#include<fstream>

void readInput(const char* Path);
 void removePunctucationMarks();
 void removeSpacing();
 void insertDots();
 char * getText();
 void generateUnigrams();
  void generateBigrams();
  void generateTrigrams();
 double validateSentance(string str);
 string sentenceCreation(int position);

 int main()
 {
      char *path="alice.txt";
      readInput(path);

     return 0;
 }
 void readInput(const char* Path)
 {
     ifstream infile;


     infile.open(Path);

     if(!infile.fail())
         cout<<"File opened successfully"<<endl;
     else
         cout<<"File failed to open"<<endl;

     int arrSize=100000000;
     char *arr=new char[arrSize];
     int i=0;
     while(!infile.eof()&&i<arrSize)
     {
         infile.get(arr[i]);
         i++;
     }
     arr[i-1]='\0';
     for(short i=0;i<arrSize&&arr[i]!='\0';i++)
     {
         cout<<arr[i];
     }





 }

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Здесь простым методом удвоения ...

#include<iostream>
#include<string>
#include<fstream>
#include <cstdint>
#include <cstring>

using namespace std;

void readInput(const char* Path)
{
     ifstream infile;


     infile.open(Path);

     if(!infile.fail())
         cout<<"File opened successfully"<<endl;
     else{
         cout<<"File failed to open"<<endl;
         return;
     }

     int capacity=1000;
     char *arr=new char[capacity];
     char *temp;

     int i=0;

     while(infile >> arr[i])
     {
         i++;
         if ( i >= capacity ) {

             temp = new char[capacity*2];
             std::memcpy(temp , arr, capacity);
             delete [] arr;
             arr = temp;
             capacity *=2;
         }
     }
 }

int main()
{
    char *path="alice.txt";
    readInput(path);

    return 0;
}
0 голосов
/ 21 сентября 2018

Это решение в стиле C, которое работает.Он проверяет размер файла, а затем выделяет необходимую память для массива и считывает все содержимое файла за один вызов.Вызов fread () возвращает количество запрошенных вами байтов или произошла ошибка (проверьте fread () ссылка)

# include <cstring>
# include <cstdlib>
# include <cstdio>

int main(int argc, char *argv[]) {
    char *data;
    int data_len;
    FILE *fd;

    fd = fopen ("file.txt", "r");
    if (fd == NULL) {
        // error
        return -1;
    }

    fseek (fd , 0 , SEEK_END);
    data_len = ftell (fd);
    rewind (fd);

    data = (char *) malloc ((data_len + 1) * sizeof (char));
    memset (data, data_len + 1, NULL);

    if (fread (data, sizeof (char), data_len, fd) != data_len) {
        // error
        return -1;
    }

    printf ("%s\n", data);

    fclose (fd);
    free (data);

    return 0;
}
0 голосов
/ 21 сентября 2018

Ошибка может возникнуть при чтении и отображении содержимого массива с использованием цикла for, а не при чтении данных из файла.Используйте int вместо short in for loop, поскольку short может увеличиваться только до 32768.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...