【发布时间】:2011-04-03 03:14:20
【问题描述】:
我不知道是否有人会及时看到,但我会尝试... 我在上 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() 信息、在论坛中搜索并将我的代码切换了大约一百万次。
PLEEEEAAASSSEEE 帮助!
这是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 是模棱两可的错误。
谢谢 N.
【问题讨论】:
-
上面没有显示,但是第二条记录前有一个\n。即每条记录都在单独的行上。
-
要格式化代码,缩进4个空格。 :)
-
您的编译器将向您发出有关隐藏其他变量的变量的警告。你应该听听。
-
虽然我看不到您的文件读取问题在哪里,但我可以告诉您
using namespace std行。如果你添加using namespace std;,你会写一个类似cout<<"stuff";而不是std::cout<<"stuff";的cout。 -
顺便说一句,查看您对
getline()的调用是否不起作用的简单方法是在调用getline()之后直接输出line。因此,即之后立即执行std::cerr << line << endl;之类的操作。不要这样做std::cout,因为它会缓冲并且在调用时可能不会立即输出。这样可以查看您是否真的在读取您想要的数据。正如我在回答中提到的,我认为您对getline()没有任何问题,而且您的真正问题还在后面。像我提到的那样调试代码将帮助您更快地隔离问题点。