gpt4 book ai didi

c++ - getline() 重复读取我文件的第一行

转载 作者:行者123 更新时间:2023-11-30 02:09:24 25 4
gpt4 key购买 nike

我不知道是否有人会及时看到这个,但我会尽力...我正在学习 C++ 入门类(class)(本科生),我有一个周一早上要交的作业...(是的!我知道我拖延了 :),)

好的。我必须以这种形式阅读学生记录:

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() 信息,在论坛中搜索并切换我的代码大约一百万次。

PLEEEEAAASSSSEEE 帮助!

这是 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";
}

}

PS 我正在开发 visual studio 2010我的文件是 *.dos

哦,我拿出来了

使用命名空间标准;

因为它给出了:cout is ambiguous error。

谢谢N.

最佳答案

从哪里开始!!!!

不好的做法。每行一个!

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);
}

这是一个很常见的错误。
在这里测试良好状态(通常)是错误的。这是因为当您到达文件末尾时,您通常希望循环退出。但最后一次读取实际上读取到文件末尾但未超过文件末尾,因此它不会触发 EOF 标志并重新进入循环。那么下次读取就会失败:

while (input.good() && numOfLine < MAX_RECORDS)
{
getline (input,line);

更好的版本是:

while (getline (input,line) && numOfLine < MAX_RECORDS)
{

这里是正确的:

    while (getline(inputss, token, ',') && row < ROWS )
{

这里您递增行以索引到 tempArray。但我看不到该行在哪里重置为 0。

        tempArray[row] = token; 
row++;

编辑:

基于以下 Bo 的评论。

从技术上讲,这样做没有错:

const char *file=filename.c_str();
std::ifstream input(file, std::ios::in);

这里 file 被立即使用并且不再使用。但根据经验,我发现通过这样做,您已经将一个新变量引入了其他人可以随意重用的上下文中。通常这不是问题,但是这个特定的指针可能会无形中变得无效(如果文件名对象被修改,那么文件指针可能会变得无效)。

这是一个维护问题,当您有多个开发人员修改代码时尤其危险。如果变量 file 稍后在开发人员“A”和开发人员“B”的代码中重新使用,然后出现并添加修改变量 filename 的代码,现在你在可能很危险的情况。

因此,存储可能变得不可见无效的指针总是更安全。因此,使用它们的唯一安全方法是作为函数的参数。

std::ifstream input(filename.c_str(), std::ios::in);

我最近遇到的另一种情况是在略有不同的上下文中遇到同样的问题:

QString   path(<Some String>);
char* file = path.toLatin1().data();
readFile(file);

这里的问题是 toLatin() 返回一个 QByteArray 的对象。该对象按值返回,未分配给任何变量,因此是临时对象。临时对象在表达式的末尾被销毁,因此返回指向 QByteArray 内部部分的指针的方法 data() 已分配给变量 file 一个值,一旦 ' ;'被击中。

执行此操作的安全方法是将结果作为参数直接传递给函数:

readFile(path.toLatin1().data());

关于c++ - getline() 重复读取我文件的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5527333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com