1

Тема: Вивести номери рядків

Хочу зробити програму яка вгадує подію по опису. Треба спочатку створити "словник" і виводити номери рядків файла v.txt(із дієсловами) які співпадають із словами у тексті введеному користувачем. Має виходити запис типу

Process1:21,323,21,55
Process2:65,33,78

Виводить лише один номер.

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <fstream>
using namespace std;

BOOL LoadFile(LPSTR& FileText, LPSTR FileName) {
    HANDLE hFile;
    BOOL bSuccess = FALSE;

    hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
    if (hFile != INVALID_HANDLE_VALUE) {
        DWORD FileSize;
        FileSize = GetFileSize(hFile, NULL);
        if (FileSize != 0xFFFFFFFF) {
            FileText = (LPSTR)GlobalAlloc(GPTR, FileSize + 1);
            if (FileText != NULL) {
                DWORD Read;
                if (ReadFile(hFile, FileText, FileSize, &Read, NULL)) {
                    FileText[FileSize] = 0;
                    bSuccess = TRUE;
                }
            }
        }
        CloseHandle(hFile);
    }
    return bSuccess;
}
std::vector<std::string> delim(const char *str) {
    std::vector<std::string> result;
    char *strCopy = _strdup(str);
    char *p = strtok(strCopy, "\n\r");
    while (p != NULL) {
        result.push_back(p);
        p = strtok(NULL, "\n\r");
    }
    free(strCopy);
    return result;
}
int main() {
    char *buff;
    std::string s;
    std::string name;
    if (LoadFile(buff, "v.txt")) {
        std::vector<std::string> verbs = delim(buff);
        std::cout << "Process name: ";
        cin >> name;
        std::cout << "Process description: ";
        cin >> s;
        std::vector<std::string> text_words = delim(s.c_str());
        cout << name << ":";
        for (int i = 0; i < text_words.size(); i++) {
            for (int j = 0; j<verbs.size(); j++) {
                if (verbs[j] == text_words[i])
                    std::cout << j << ", ";
            }
        }
    }
    GlobalFree(buff);
    return 0;
}

2

Re: Вивести номери рядків

  1. Ви точно певні, що у файлі саме \r\n, а не, наприклад, просто \n?

  2. <string.h> - бібліотека мови C. <cstring> - аналогічна їй бібліотека мови C++. Ви якою мовою пишете? Зупиніться на чомусь одному. Те саме - про <stdio.h>.

  3. Нащо вам узагалі GlobalAlloc? Він за документацією не рекомендований, крім випадків, коли документація прямо вимагає. Чим вас звичайний оператор new не влаштовує?

  4. Чому ви взагалі віндошні функції використовуєте? Звичайний fstream::getline вам спокійно усе прочитає по рядках, без усієї цієї мороки.

Подякували: leofun011

3

Re: Вивести номери рядків

Все ще виводить один номер

#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <fstream>
#include <sstream>
using namespace std;

std::vector<std::string> LoadFile(char *FileName) {
    std::vector<std::string> result;
    std::ifstream inputFile(FileName);
    if (inputFile.is_open()) {
        std::string line;
        while (std::getline(inputFile, line)) {
            result.push_back(line);
        }
        inputFile.close();
    }
    return result;
}
std::vector<std::string> delim(const std::string str) {
    std::vector<std::string> result;
    std::istringstream iss(str);
    std::string word;
    while (iss >> word) {
        result.push_back(word);
    }
    return result;
}
int main() {
    std::string s;
    std::string name;
    std::vector<std::string> verbs = LoadFile("v.txt");
    std::cout << "Process name: ";
    cin >> name;
    std::cout << "Process description: ";
    cin >> s;
    std::vector<std::string> text_words = delim(s);
    cout << name << ":";
    for (int i = 0; i < text_words.size(); i++) {
        for (int j = 0; j < verbs.size(); j++) {
            if (verbs[j] == text_words[i])
                std::cout << j << ", ";
        }
    }
    return 0;
}
Подякували: asdf1

4

Re: Вивести номери рядків

Чат GPT допоміг швидше. Цим треба замінити і тоді виводить кілька номерів

std::cout << "Process description: ";
std::cin.ignore();  // Ignore the newline character left in the buffer
std::getline(std::cin, s);
Подякували: koala1

5

Re: Вивести номери рядків

Вибачте за втручання, але не можу зрозумiти...
Функцiя delim() для чого? Вона пушить переданий аргумент в вектор, та поверта цей вектор, з всього одним елементом?
Для чого це? I для чого там istringstream та while()? Чому не просто result.push_back(str);?
А далi for по цьому вектору з одним елементом?

Це не критика, менi просто цiкаво, що це за магiя така, для чого так зроблено?

6

Re: Вивести номери рядків

delim розбирає вхідну стрічку за розділювачем (англ. delimitator); оригінальна версія використовувала strtok з мови C і явно задавала розділювач "\r\n", нова покладається на istringstream::operator >> і відповідно використовує будь-які відступи (whitespace symbols).

Подякували: asdf1

7

Re: Вивести номери рядків

Дякую, шановний! про istringstream::operator >> тепер буду знати!