#7
by かずま » 6年前
getline を定義してやれば、そのコードで動くことを確認しました。
コード:
#include "DxLib.h"
#include <string>
#include <vector>
using namespace std;
class MapCheck {
vector<vector<int>> Map;
int m_line, m_col;
public:
void LoadData(int y, int x, string s);
void ShowData(int y, int x);
bool getline(int fh, string& s);
};
void MapCheck::LoadData(int y,int x,string s){
m_line = y; //縦
m_col = x; //横
int line = 0;
int count = 0;
int sum = 0;
int nokorinoketa=0;
int fh = FileRead_open(s.c_str());
string buf[3000];
Map.resize(m_line);//resizeで行数を決める
for(int i = 0; i<m_line; i++){
Map[i].resize(m_col);
}//resizeで各行の列数を決める
while(fh && getline(fh,buf[line])){
line++;
}
for(int line=0; line<y; line++){
for(int col=0; col<x; col++){
if(col < x-1){
sum = buf[line][count]-48;
count++;
while(isdigit(buf[line][count])){
sum = sum*10 + (buf[line][count])-48;
count++;
}
Map[line][col] = sum;//Noが格納
count++;
}
if(col == x-1){//最後の数字
nokorinoketa = buf[line].size()-count;
sum = buf[line][count] - 48;
while(nokorinoketa > 1){
count++;
sum = sum*10 + (buf[line][count])-48;
nokorinoketa--;
}
Map[line][col] = sum;//Noが格納
}
}
count=0;
}
FileRead_close(fh);
}
void MapCheck::ShowData(int y, int x)
{
for (int i = 0; i < y; i++)
for (int j = 0; j < x; j++)
DrawFormatString(j*60, i*40+100, GetColor(0, 255, 255),
"%8d", Map[i][j]);
}
bool MapCheck::getline(int fh, string& s)
{
char buf[1024];
if (FileRead_gets(buf, sizeof buf, fh) == -1) return false;
s = buf;
return true;
}
int WINAPI WinMain(HINSTANCE hi, HINSTANCE hpi, LPSTR cl, int cs)
{
if (DxLib_Init() == -1) return -1 ;
MapCheck mc;
mc.LoadData(4, 4, "media/data.csv");
mc.ShowData(4, 4);
WaitKey();
ret:
DxLib_End();
return 0;
}
FileRead_open() に失敗した場合のことは考えなくていいのですね?
行単位で読み込んで、自分で文字列を数値に直したいのなら、負の数の
入力はないとして、次のように書けばよいのではないでしょうか?
コード:
void MapCheck::LoadData(int y, int x, string s)
{
m_line = y;
m_col = x;
Map.resize(m_line);
for (int i = 0; i < m_line; i++) Map[i].resize(m_col);
int fh = FileRead_open(s.c_str());
for (int line = 0; line < m_line; line++) {
char buf[1024];
FileRead_gets(buf, sizeof buf, fh);
int i = 0;
for (int col = 0; col < m_col; col++) {
int sum = 0;
while (isdigit((unsigned char)buf[i]))
sum = sum*10 + (buf[i++] - '0');
Map[line][col] = sum;
i++; // skip ','
}
}
FileRead_close(fh);
}
getline を定義してやれば、そのコードで動くことを確認しました。
[code]
#include "DxLib.h"
#include <string>
#include <vector>
using namespace std;
class MapCheck {
vector<vector<int>> Map;
int m_line, m_col;
public:
void LoadData(int y, int x, string s);
void ShowData(int y, int x);
bool getline(int fh, string& s);
};
void MapCheck::LoadData(int y,int x,string s){
m_line = y; //縦
m_col = x; //横
int line = 0;
int count = 0;
int sum = 0;
int nokorinoketa=0;
int fh = FileRead_open(s.c_str());
string buf[3000];
Map.resize(m_line);//resizeで行数を決める
for(int i = 0; i<m_line; i++){
Map[i].resize(m_col);
}//resizeで各行の列数を決める
while(fh && getline(fh,buf[line])){
line++;
}
for(int line=0; line<y; line++){
for(int col=0; col<x; col++){
if(col < x-1){
sum = buf[line][count]-48;
count++;
while(isdigit(buf[line][count])){
sum = sum*10 + (buf[line][count])-48;
count++;
}
Map[line][col] = sum;//Noが格納
count++;
}
if(col == x-1){//最後の数字
nokorinoketa = buf[line].size()-count;
sum = buf[line][count] - 48;
while(nokorinoketa > 1){
count++;
sum = sum*10 + (buf[line][count])-48;
nokorinoketa--;
}
Map[line][col] = sum;//Noが格納
}
}
count=0;
}
FileRead_close(fh);
}
void MapCheck::ShowData(int y, int x)
{
for (int i = 0; i < y; i++)
for (int j = 0; j < x; j++)
DrawFormatString(j*60, i*40+100, GetColor(0, 255, 255),
"%8d", Map[i][j]);
}
bool MapCheck::getline(int fh, string& s)
{
char buf[1024];
if (FileRead_gets(buf, sizeof buf, fh) == -1) return false;
s = buf;
return true;
}
int WINAPI WinMain(HINSTANCE hi, HINSTANCE hpi, LPSTR cl, int cs)
{
if (DxLib_Init() == -1) return -1 ;
MapCheck mc;
mc.LoadData(4, 4, "media/data.csv");
mc.ShowData(4, 4);
WaitKey();
ret:
DxLib_End();
return 0;
}
[/code]
FileRead_open() に失敗した場合のことは考えなくていいのですね?
行単位で読み込んで、自分で文字列を数値に直したいのなら、負の数の
入力はないとして、次のように書けばよいのではないでしょうか?
[code]
void MapCheck::LoadData(int y, int x, string s)
{
m_line = y;
m_col = x;
Map.resize(m_line);
for (int i = 0; i < m_line; i++) Map[i].resize(m_col);
int fh = FileRead_open(s.c_str());
for (int line = 0; line < m_line; line++) {
char buf[1024];
FileRead_gets(buf, sizeof buf, fh);
int i = 0;
for (int col = 0; col < m_col; col++) {
int sum = 0;
while (isdigit((unsigned char)buf[i]))
sum = sum*10 + (buf[i++] - '0');
Map[line][col] = sum;
i++; // skip ','
}
}
FileRead_close(fh);
}
[/code]