Редактировать:
Нашел свою ошибку. Это было с самим текстовым файлом. Мне удалось создать два текстовых файла разного размера; и ссылался не на тот файл при сравнении размеров.
Для всех, кто прокомментировал и ответил, я рассмотрел все отзывы. Благодарность!
работает над лабораторией для университетского класса. Мне было трудно понять, как прочитать все содержимое файла .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;
}
Почему (wchar_t*) "Alice"? textBuffer[i] == inputLine[0] очень редко будет правдой (и вы проверяете это дважды).
почему вы используете ifstream::binary | ifstream::in или | следует использовать для режимов in и out, а не binary и in, поскольку они оба являются режимами записи.





Я думаю, что одна из проблем в опубликованном вами коде находится в строке:
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, это странно. Возможно, у вас поврежден жесткий диск.
В вашем коде утечка памяти. Вы должны освободить
textBuffer, если он вам не нужен