C++ fstream не читает весь файл

Редактировать:

Нашел свою ошибку. Это было с самим текстовым файлом. Мне удалось создать два текстовых файла разного размера; и ссылался не на тот файл при сравнении размеров.

Для всех, кто прокомментировал и ответил, я рассмотрел все отзывы. Благодарность!

работает над лабораторией для университетского класса. Мне было трудно понять, как прочитать все содержимое файла .txt, который содержит полный текст для «Алисы в стране чудес».

Некоторый контекст:

Это только отправная точка для создания программы openCL, которая будет выполнять MapReduce для строкового поиска (т. Е. Подсчитывать, сколько раз «Алиса» появляется в тексте). Программа компилируется и запускается на виртуальной машине Ubuntu; скомпилирован позже для FPGA.

Ubuntu сообщает мне, что размер файла составляет 148 545 байт. Мой код говорит 53073 байта. Он также не считывает весь файл, когда я пытаюсь его распечатать.

Функционально код в настоящее время работает с фрагментом файла (текстом «Алиса в стране чудес»). Но, похоже, он не читает / не просматривает весь текст. Я все время искал решение своего тяжелого положения, но безуспешно.

Так! Вот мой код:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <iomanip>
#include <math.h>
#include <fstream>
#include "CL/opencl.h"
#include "AOCL_Utils.h"
using namespace std;

int main(int argc, char** argv) {


    string line;
    long wordMatch, wordLength;
    wchar_t* inputLine;
    ifstream inputText;
    inputText.open("alice.txt", ifstream::binary | ifstream::in); // Open the text
    inputText.seekg(0, ios::end);
    int length = inputText.tellg(); // Gives back the wrong byte size
    cout << length << "\n";
    inputText.close();

    char * textBuffer = new char [length];
    wordMatch = 0;

    inputText.open("alice.txt"); // Could've just seeked to the start

    inputText.read(textBuffer, inputText.gcount()); 

    //cout << inputText.gcount() << " bytes in file \n"; // Trying to get correct bytesize

    while(getline(inputText,line)) // Read out the text, but stops before it's finished
    {
        cout << line << "\n";
    }

    inputLine = (wchar_t*) "Alice"; // What we're counting occurrences of

    // My little counting routine. Works fine.
    for (int i = 0; i < length; i++)
    {
        if (textBuffer[i] == inputLine[0])
        {
            wordLength = 0;
            if (textBuffer[i] == inputLine[0]) {
                while (textBuffer[i+wordLength] == inputLine[wordLength]) { 
                    //cout << textBuffer[i+wordLength] << " and " << inputLine[wordLength] << "\n"; 
                    wordLength++;
                }
                if (inputLine[wordLength] == 0) {
                        wordMatch++;                    
                } 
            }

        }

    }
    inputText.close();
    cout << length << " bytes \n";
    cout << wordMatch << "\n";


  return 0;
}

В вашем коде утечка памяти. Вы должны освободить textBuffer, если он вам не нужен

Asesh 29.03.2018 06:37

Почему (wchar_t*) "Alice"? textBuffer[i] == inputLine[0] очень редко будет правдой (и вы проверяете это дважды).

molbdnilo 29.03.2018 06:56

почему вы используете ifstream::binary | ifstream::in или | следует использовать для режимов in и out, а не binary и in, поскольку они оба являются режимами записи.

KPCT 29.03.2018 07:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
804
1

Ответы 1

Я думаю, что одна из проблем в опубликованном вами коде находится в строке:

inputText.read(textBuffer, inputText.gcount()); 

Я подозреваю, что внутренний счетчик, возвращаемый gcount(), обнуляется после закрытия файла и его повторного открытия.

Когда я изменил эту строку на:

int n = inputText.gcount();
cout << "n: " << n << "\n";
inputText.read(textBuffer, n); 

я получил

n: 0

как выход.

Я бы изменил эту строку на:

inputText.read(textBuffer, length); 

Итак, я пробовал это. Я попробовал это, прежде чем задать вопрос в Интернете, и, чтобы быть уверенным, сделал это снова. По-прежнему возвращается та же неправильная длина файла и не загружается весь файл.

BaleineBoy 30.03.2018 04:46

@BaleineBoy, это странно. Возможно, у вас поврежден жесткий диск.

R Sahu 30.03.2018 07:05

Другие вопросы по теме