C++ getline()正在重复读取文件的第一行
我不知道是否有人会及时看到,但我会尝试。。。 我在一个介绍性的C++课程(本科),我有一个任务到期星期一上午……(是的,我知道我拖延:), 嗯。我必须阅读此表格中的学生记录:C++ getline()正在重复读取文件的第一行,c++,getline,C++,Getline,我不知道是否有人会及时看到,但我会尝试。。。 我在一个介绍性的C++课程(本科),我有一个任务到期星期一上午……(是的,我知道我拖延:), 嗯。我必须阅读此表格中的学生记录: Adriana,Smith,692493955,50,43,52,86,74,83 Adrienne,Johnson,480562092,75,72,93,71,81,89 Bla, Bla, Bla 从一个文件(最多200个)和排序他们和东西 我已经成功地实现了所有其他必要的功能,但无法验证它们 我做了一个函数,应该打
Adriana,Smith,692493955,50,43,52,86,74,83
Adrienne,Johnson,480562092,75,72,93,71,81,89
Bla, Bla, Bla
从一个文件(最多200个)和排序他们和东西
我已经成功地实现了所有其他必要的功能,但无法验证它们
我做了一个函数,应该打开文件,读取每一行,在每一行中读取每个令牌,并将它们存储在临时数组中。这个tempArr[9]在放入真正的数组[9][200]之前经过验证
我已经设法打开文件,读取第一行并将其标记为一个数组,但是当while循环再次出现时,它再次读取文件的第一行,因此当我打印出真实数组时,我得到第一条记录的+/-200倍
我在cplusplus.com上反复阅读我的手册getline()info,在论坛中搜索,并切换了一百万次代码
请看帮助
以下是fn:
void getFile(std::string realArray[][200], const int ROW_SIZE)
{
std::string filename, token, line;
int positionLine(0);
int positionToken(0);
int row(0);
int numOfLine(0);
const int ROWS (9);
const int MAX_RECORDS (200);
std::string tempArray[ROWS];
std::cout << "Please enter the desired filename with it's extension:\t ";
std::cin >> filename;
const char *file=filename.c_str();
std::ifstream input(file, std::ios::in);
while (!input.is_open())
{
std::cout << "The file did not open correctly. \n\nPlease enter a valid filename.\n";
std::cin >> filename;
const char *file=filename.c_str();
std::ifstream input(file, std::ios::in);
}
while (input.good() && numOfLine < MAX_RECORDS)
{
getline (input,line);
std::istringstream inputss (line);
while (getline(inputss, token, ',') && row < ROWS )
{
tempArray[row] = token;
row++;
}
numOfLine++;
validateData (tempArray,ROWS , numOfLine);
storeData(tempArray, ROWS, realArray, ROW_SIZE, numOfLine);
}
if (numOfLine == MAX_RECORDS)
{
std::cout << "The maximum number of records to be read (" << MAX_RECORDS << ") has been reached.\n";
}
}
void getFile(std::string realArray[][200],常量int行大小)
{
std::字符串文件名、标记、行;
内部位置线(0);
intpositiontoken(0);
int行(0);
int numOfLine(0);
常量int行(9);
const int MAX_记录(200);
std::string tempArray[行];
std::cout>filename;
const char*file=filename.c_str();
std::ifstream输入(文件,std::ios::in);
而(!input.is_open())
{
std::cout>filename;
const char*file=filename.c_str();
std::ifstream输入(文件,std::ios::in);
}
while(input.good()&&numOfLine std::cout我的猜测是您没有重新设置行的值
…因此,当您增加行并且它超过行的值
时,您停止在tempArray
中存储任何新值。因此,您可以从getline()读取文件
,但您没有将这些新值存储在tempArray中,以便在行>=行时进行验证
重置行
的值应该可以做到这一点。根据validateData()
函数的工作方式,您可能还想将行
的值传递给它,而不是行
,这样您就不会在getline时将前一个循环中存储的数据与当前循环中读取的数据混在一起(inputss,token,“,”)
返回一个错误,并在读取行
数据量之前退出
希望这有帮助
Jason我的猜测是您没有重新设置行的值
…因此,当您增加行数并且它超过行的值时,您将停止在tempArray
中存储任何新值。因此,您从getline()读取的文件很好
,但您没有将这些新值存储在tempArray中,以便在行>=行时进行验证
重置行
的值应该可以做到这一点。根据validateData()
函数的工作方式,您可能还想将行
的值传递给它,而不是行
,这样您就不会在getline时将前一个循环中存储的数据与当前循环中读取的数据混在一起(inputss,token,“,”)
返回一个错误,并在读取行
数据量之前退出
希望这有帮助
杰森从哪里开始
坏习惯,一行一个
std::string filename, token, line;
这些未使用。请删除它们
int positionLine(0);
int positionToken(0);
不要将指向字符串的指针提取到新变量中。
如果文件名被更改,则文件无效。
只有在将结果传递到函数中时才可以安全使用
const char *file=filename.c_str();
std::ifstream input(file, std::ios::in);
所以你应该这样做
std::ifstream input(file.c_str());
这里。您正在声明一个全新的变量input
。此变量与另一个变量input
无关。此版本在while循环结束时超出范围时将被销毁
while (!input.is_open())
{
// <STUFF DELETED>
std::ifstream input(file, std::ios::in);
}
编辑:
根据下面薄熙来的资料
从技术上讲,这样做没有错:
const char *file=filename.c_str();
std::ifstream input(file, std::ios::in);
在这里,文件被立即使用,并且不再使用。根据经验,尽管我发现通过这样做,您已经在上下文中引入了一个新变量,其他人可以随意重复使用。通常这不是一个问题,但这个特定指针可能会无形中失效(如果修改文件名对象,则文件指针可能会变得无效)
这是一个维护问题,当有多个开发人员修改代码时尤其危险。如果开发人员“a”和开发人员“B”稍后在代码中重复使用变量文件
,则会出现并添加修改变量文件名
的代码,现在您的处境可能很危险
因此,存储可能变得无形无效的指针总是比存储指针更安全,因此使用指针的唯一安全方法是将其作为函数的参数
std::ifstream input(filename.c_str(), std::ios::in);
我最近遇到的另一个情况是,在一个稍微不同的背景下出现了相同的问题:
QString path(<Some String>);
char* file = path.toLatin1().data();
readFile(file);
从哪里开始
坏习惯,一行一个
std::string filename, token, line;
这些未使用。请删除它们
int positionLine(0);
int positionToken(0);
不要将指向字符串的指针提取到新变量中。
如果文件名被更改,则文件无效。
只有在将结果传递到函数中时才可以安全使用
const char *file=filename.c_str();
std::ifstream input(file, std::ios::in);
所以你应该这样做
std::ifstream input(file.c_str());
这里。您在中声明了一个全新的变量
readFile(path.toLatin1().data());