Как читать многострочный текстовый файл - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь прочитать текстовый файл и вывести его содержимое в структуру. (Я пытаюсь сначала вывести содержимое, а не сразу переходить к структурам).

Я пытался прочитать файл, но, похоже, он не распознает имя, даже если они совпадают и файл существует.

Текстовый файл ("settings.txt")

vida 3
vel_bola 1
vel_barreira 1
tamanho 15
quant_tijolos 30
tipo_tijolo 1
vel_brinde 1
tipo_brinde 1
tempo_brinde 60
prob_normal 70
prob_resist 20
prob_magico 10
sound 1

Мой код пока что

int _tmain(int argc, LPTSTR argv[]) {

#ifdef UNICODE
    _setmode(_fileno(stdin), _O_WTEXT);
    _setmode(_fileno(stdout), _O_WTEXT);
#endif

    //jogo j;

    HANDLE hFile;
    byte buffer[BUFFERSIZE] = { 0 };
    DWORD nIn = 0;

    LPCWSTR fName = TEXT("settings.txt");

    hFile = CreateFile(fName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile == INVALID_HANDLE_VALUE) {
        _tprintf(TEXT("Error opening the file %s!\n\n"), fName);
    }else
        _tprintf(TEXT("File %s Open!\n\n"), fName);

    if (ReadFile(hFile, buffer, BUFFERSIZE - 2, &nIn, NULL) == FALSE) {
        _tprintf(TEXT("It wasn't possible to read the file %s\n\n"), fName);
        CloseHandle(hFile);
        return -1;
    }

    if (nIn > 0 && nIn <= BUFFERSIZE - 2) {
        buffer[nIn] = TEXT('\0');
    }

    _tprintf(TEXT("%s", buffer));   

    return 0;

}

EDIT: Структура для использования

typedef struct Jogo {

    unsigned vidas;
    unsigned vel_bola;
    unsigned vel_barreira;
    unsigned tamanho_barreira;
    unsigned quant_tijolos;
    unsigned tipo_tijolo;
    unsigned vel_brinde;
    unsigned tipo_brinde;
    unsigned tempo_brinde;
    unsigned prob_normal;
    unsigned prob_resist;
    unsigned probm_magico;
    BOOL sound;

}jogo;

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

ОБНОВЛЕНИЕ: Теперь он читает файл и помещает все в буфер, но все равно не выводит на экран.

ОБНОВЛЕНИЕ КОНЕЦ

ОБНОВЛЕНИЕ 2: Это работает так, как задумано, теперь это вопрос помещения его в структуру.

UPDATE2 END

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Макрос TEXT, вероятно, не понимает запятую в

TEXT("%s", buffer)

так что я бы использовал

_tprintf(TEXT("%s"), buffer); 

или просто

_tprintf("%s", buffer); 

, оба из которых хранят аргументы для _tprintf отдельно.

0 голосов
/ 21 мая 2019

Вместо чтения файла с помощью Windows File Api, вы также можете использовать потоковый метод:

#include <windows.h>
#include <fstream>  

#include <iostream>  
#include <tchar.h>
using namespace std;
#define BUFFERSIZE 1024
typedef struct Jogo {

    unsigned vidas;
    unsigned vel_bola;
    unsigned vel_barreira;
    unsigned tamanho_barreira;
    unsigned quant_tijolos;
    unsigned tipo_tijolo;
    unsigned vel_brinde;
    unsigned tipo_brinde;
    unsigned tempo_brinde;
    unsigned prob_normal;
    unsigned prob_resist;
    unsigned probm_magico;
    BOOL sound;//BOOL is defined as int;

}jogo;
int _tmain(int argc, LPTSTR argv[]) {

#ifdef UNICODE
    _setmode(_fileno(stdin), _O_WTEXT);
    _setmode(_fileno(stdout), _O_WTEXT);
#endif

    jogo j;
    unsigned int arr[13] = { 0 };
    char memmber[BUFFERSIZE] = { 0 };
    ifstream OpenFile("settings.txt");
    for (int i = 0; i < 13; i++)
    {
        OpenFile >> member;
        OpenFile >> arr[i];
        _tprintf(TEXT("%s %d\n"), member,arr[i]);//Also need to ensure the order in .txt file is the same as the struct members.
    }
    memcpy(&j, arr,sizeof(arr));//Since the memory of struct members is the same as arry, so we can convert it with memory copy.

    return 0;

}

UPDATE:

Использовать функцию библиотеки C sscanf (после получения буфера из файла):

...
_tprintf(TEXT("%s"), buffer);
char temp[20] = { 0 };
sscanf_s(buffer,"%s %d %s %d %s %d %s %d %s %d %s %d %s %d %s %d %s %d %s %d %s %d %s %d %s %d",temp,&j.vidas,temp,&j.vel_bola, temp, &j.vel_barreira, temp, &j.tamanho_barreira, temp, &j.quant_tijolos, temp, &j.tipo_tijolo, temp, &j.vel_brinde, temp, &j.tipo_brinde, temp, &j.tempo_brinde, temp, &j.prob_normal, temp, &j.prob_resist, temp, &j.probm_magico, temp, &j.sound);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...