C++;WinAPI-从文件读取和转换值 < C++ >使用WiAPI的新手。刚刚在互联网上搜索了类似的问题,但找不到正确的问题

C++;WinAPI-从文件读取和转换值 < C++ >使用WiAPI的新手。刚刚在互联网上搜索了类似的问题,但找不到正确的问题,c++,winapi,C++,Winapi,我试图读取一个包含整数值的文件,并将这些数值保存到字符串缓冲区。然后我需要将字符串转换为int数组,以便计算所有数组元素的平均值 此时,我遇到了一个问题,文件中的值没有正确保存-输出中有一些值的冗余 例如,输入文件如下所示:1 2 5 3 96 72 33 47 43 91 代码抛出的值如下:1 2 5 3 96 72 33 47 43 91 43 91 43 请查看我的代码: #include <iostream> #include <Windows.h> #inclu

我试图读取一个包含整数值的文件,并将这些数值保存到字符串缓冲区。然后我需要将字符串转换为int数组,以便计算所有数组元素的平均值

此时,我遇到了一个问题,文件中的值没有正确保存-输出中有一些值的冗余

例如,输入文件如下所示:
1 2 5 3 96 72 33 47 43 91
代码抛出的值如下:
1 2 5 3 96 72 33 47 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;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间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缓冲区=NULL;
DWORD dwSizeofBuffer=sizeof(缓冲区);
Buffer=(LPSTR)GlobalAlloc(GPTR,MAX_PATH*sizeof(CHAR));

cout有人建议我使用标准的
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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,TCHAR*argv[])
{
//第二个过程是在一个国家或一个国家或一个国家或一个国家或地区
流文件;
打开(“RandomValues.txt”,ios::in |:::ios::out);
字符串缓冲区=”;
对于(int i=0;!File.eof();i++)
{
getline(文件、缓冲区);

cout以下是如何将文件中的整数读入向量。我假设整数仅用空格分隔(即文件中没有逗号或类似字符)。如果不是这样,则代码必须稍微复杂一些(但不太复杂)

//打开文件
ifstream文件(“RandomValues.txt”,ios::in);
如果(!File.is_open())
cerr>val)
值。推回(val);
//打印出数值
对于(无符号整数i=0;i上下文无关:更好地使用C++标准,如“代码> fSturth<代码>,而不是使用Windows特定API。它将更容易,跨平台toothe太简单;它做它声称它做的事情。你在看DeBytRead?上面代码有很多问题。例如,缓冲区计算的大小是错误的。我们能不能得到一个?两个事实都很清楚。整数是以二进制形式存储的,对吗?每个整数有多少字节?@wiki11ful您似乎使一个简单的操作变得非常困难。我对您的位置有点迷茫。我建议您重新开始,但如果您的文件确实是文本,那么不要使用Win32 API,这只会使事情变得更加困难。您的使用f
!File.eof()
是,您应该在尝试打印读取内容之前检查读取是否成功。另外
int*Values=new int(str_length);
是错误的:这是分配一个
int
并将其初始化为值
str_length
,而不是分配数组。还要注意
sizeof(Values)
不是元素的数量,而是指针的大小。您应该使用
std::vector
。通过使用
int*Values=newint(stru长度);
我想定义数组的大小
Values
应该是
stru长度
数组分配将类似于
int*Values=newint[stru长度];
(使用
[]
而不是
()
)请注意,在这种情况下,分配的元素不会自动初始化..或者.我需要补充的是,对于文件中的值的第一次组合,它工作得很好,今天我生成了随机数并将tchem保存到一个文件中,现在它只读取第一个value@wiki11ful这个文件有什么不同吗?例如,如果t之间有逗号他对第一个数字进行编号,然后此代码将在第一个数字之后失败。实际上,文件中的值之间没有昏迷,它们之间只有空格。这是一个简单的.txt文件,其中包含由
srand
function@wiki11ful我当时没有解释。如果它在现在起作用之前起作用,那么一定有什么原因某个地方发生了变化。我注意到,该文件在整数值之间包含超过1个空格,这可能是原因-我检查了txt文件,它有2个空格,当该值只有1个数字时,可以有3个空格
#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;
}
// 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';