C ++ WinAPI - чтение и преобразование значений из файла - PullRequest
0 голосов
/ 01 августа 2020

Я новичок ie в использовании WinAPI в C ++. Просто искал целое число rnet на предмет похожих проблем, но не смог найти правильный.

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

В этот момент у меня возникла проблема, что значения из файла не сохраняются правильно - есть избыточность некоторые значения на выходе.

Например, входной файл выглядит так: 1 2 5 3 96 72 33 47 43 91 Код выдает такие значения, как: 1 2 5 3 96 72 33 47 43 91 43 91 43 91 43 91 43

Пожалуйста, посмотрите мой код:

#include <iostream>
#include <Windows.h>
#include <string>
#include <tchar.h>
#include <cstdlib>
#include <ctime>
using namespace std;

int main( int argc, TCHAR *argv[] )
{
HANDLE hfile = CreateFile("RandomValues.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); 
    DWORD dwBytesRead = 0;
    int SizeofFile=GetFileSize(hfile,NULL);
    LPSTR Buffer=NULL;
    DWORD dwSizeofBuffer = sizeof(Buffer);
    Buffer =( LPSTR ) GlobalAlloc( GPTR, MAX_PATH * sizeof(CHAR) );
    cout<<SizeofFile<<endl;
    for(unsigned int i=0;i<dwSizeofBuffer;i++)
    {
        ReadFile( hfile, Buffer, dwSizeofBuffer, &dwBytesRead, NULL );
        Buffer[i] = (wchar_t)Buffer[i];
        cout<<Buffer<<" ";  //checking, if values are read correct to Buffer
        
    }
    GlobalFree(Buffer);
    CloseHandle(hfile); 
    return 0;
}

ОБНОВЛЕНИЕ: меня попросили поместить последний код - он проще (я думаю) и использует векторный массив и функцию stoi, хотя ввод выглядит так: 11111. Один пользователь предложил вставить сюда новый код как edit:

#include <iostream>
#include <Windows.h>
#include <string>
#include <tchar.h>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <vector>
using namespace std;

int main( int argc, TCHAR *argv[] )
{
    //proces 2 uzyskuje dostep do plilu z liczbami i oblicza srednia liczb a wynik podaje na ekranie
    fstream File;
    File.open("RandomValues.txt", ios::in | ::ios::out);
    string Buffer = " ";
    if( File.good() ){
        for(int i=0;!File.eof();i++)
    {
        getline(File,Buffer);
        cout<<Buffer;
    }
    }
    
    
    //int str_length = Buffer.length(); 
    //int* Values;
    //Values = new int[str_length];
    vector <int> Values; 
    int j = 0;
    for (int i = 0; Buffer[i] != '\0'; i++) { 
  
         
         if (Buffer[i] == ' '){ 
            // Increment j to point to next 
            // array location 
            j++; 
        } 
        else { 
  
            // subtract str[i] by 48 to convert it to int 
            // Generate number by multiplying 10 and adding 
            // (int)(str[i]) 
           // Values[j] = Values[j] * 10 + (Buffer[i] - 48); //tries as well as *(Values + j) = *(Values + j) * 10 + (*(Buffer + i) -48) and with stoi(Buffer)
           Values.push_back(stoi(Buffer)); 
        } 
    } 
  
    for (unsigned int i = 0; i <= Values.size(); i++) { 
        cout << Values[i] << " "; 
         
    } 
//  delete [] Values;
    File.close();
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 02 августа 2020

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

// open the file
ifstream File("RandomValues.txt", ios::in);
if (!File.is_open())
    cerr << "failed to open file\n";

vector<int> Values;
// read the values (three lines of code !!!)
int val;
while (File >> val)
    Values.push_back(val);

// print out the values
for (unsigned int i = 0; i < Values.size(); i++) { 
    cout << Values[i] << " ";
cout << '\n';
0 голосов
/ 01 августа 2020

Мне предложили использовать стандартный метод fstream, конечно, он у меня есть, и он правильно читает содержимое файла, проблема началась при преобразовании значений из строки в массив int. Я поместил сюда полный код, чтобы увидеть его лучше, чем на pastebin:

#include <iostream>
#include <Windows.h>
#include <string>
#include <tchar.h>
#include <cstdlib>
#include <ctime>
#include <fstream>
using namespace std;

int main( int argc, TCHAR *argv[] )
{
    //proces 2 uzyskuje dostep do plilu z liczbami i oblicza srednia liczb a wynik podaje na ekranie
    fstream File;
    File.open("RandomValues.txt", ios::in | ::ios::out);
    string Buffer = " ";
    for(int i=0;!File.eof();i++)
    {
        getline(File,Buffer);
        cout<<Buffer;
    }
    
    int str_length = Buffer.length(); 
    int* Values = new int(str_length);
    int j = 0;
    for (int i = 0; Buffer[i] != '\0'; i++) { 
  
         
         if (Buffer[i] == ' '){ 
            // Increment j to point to next 
            // array location 
            j++; 
        } 
        else { 
  
            // subtract str[i] by 48 to convert it to int 
            // Generate number by multiplying 10 and adding 
            // (int)(str[i]) 
            Values[j] = Values[j] * 10 + (Buffer[i] - 48); //tries as well as *(Values + j) = *(Values + j) * 10 + (*(Buffer + i) -48) and with stoi(Buffer)
        } 
    } 
  
    for (unsigned int i = 0; i <= sizeof(Values); i++) { 
        cout << Values[i] << " "; 
         
    } 
    delete [] Values;
    File.close();
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...