Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ getline()正在重复读取文件的第一行_C++_Getline - Fatal编程技术网

C++ getline()正在重复读取文件的第一行

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个)和排序他们和东西 我已经成功地实现了所有其他必要的功能,但无法验证它们 我做了一个函数,应该打

我不知道是否有人会及时看到,但我会尝试。。。 我在一个介绍性的C++课程(本科),我有一个任务到期星期一上午……(是的,我知道我拖延:),

嗯。我必须阅读此表格中的学生记录:

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()&&numOfLinestd::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());