从文件填充数组时,Visual Studio 中止
Posted
技术标签:
【中文标题】从文件填充数组时,Visual Studio 中止【英文标题】:Visual Studio aborts when filling array from file 【发布时间】:2017-04-26 22:04:58 【问题描述】:我正在尝试将库存系统读入结构数组。当我调用该函数并到达第一行时,我尝试将数据写入数组,出现错误:
Lab 09.exe 中 0x777CA932 处未处理的异常:Microsoft C++ 异常:内存位置 0x00F3DC68 处的 std::out_of_range。
结构如下:
struct inventory
int record;
string toolname;
int quantity;
double cost;
;
数组声明:
inventory unsortedArray[100];
这是函数(假设文件的第一行是 83 #Electric Sander# 7 57.00):
void fillArray(inventory unsortedArray[])
ifstream file;
string line;
string delim = "#";
stringstream ss;
file.open("records.txt");
int i = 0;
while (!file.eof())
getline(file, line);
unsigned first = line.find_first_of(delim);
unsigned last = line.find_last_of(delim);
unsortedArray[i].toolname = line.substr(first, (last - first) + 1);
line.erase(first, (last - first) + 1);
ss << line;
ss >> unsortedArray[i].record;
ss >> unsortedArray[i].quantity;
ss >> unsortedArray[i].cost;
i++;
file.close();
【问题讨论】:
见Why is iostream::eof inside a loop condition considered wrong?。 我建议您使用std::string::size_type
而不是 unsigned
为您的 first
和 last
。您还需要检查 std::string::npos
的返回值。
你应该阅读std::getline(file, line, '#')
。
Visual Studio 中止?你的意思是你的程序中止了吗?
【参考方案1】:
问题 1
使用
while (!file.eof())
通常会导致问题。见Why is iostream::eof inside a loop condition considered wrong?
问题 2
使用正确的类型捕获std::string::find_first_of
和std::string::find_last_of
的返回值。
使用
auto first = line.find_first_of(delim);
auto last = line.find_last_of(delim);
或
std::string::size_type first = line.find_first_of(delim);
std::string::size_type last = line.find_last_of(delim);
问题 3
在继续使用它们之前,请务必检查 std::string::find_first_of
和 std::string::find_last_of
的返回值。
auto first = line.find_first_of(delim);
auto last = line.find_last_of(delim);
if ( first == std::string::npos )
// Didn't find it. Figure out what to do.
if ( last == std::string::npos )
// Didn't find it. Figure out what to do.
// Both checks are done. Now you can use first and last.
我的建议
使用
while (getline(file, line))
unsigned first = line.find_first_of(delim);
unsigned last = line.find_last_of(delim);
if ( first == std::string::npos )
break;
if ( last == std::string::npos )
break;
unsortedArray[i].toolname = line.substr(first, (last - first) + 1);
line.erase(first, (last - first) + 1);
// Don't use ss << line
// Construct ss in the loop. You don't need to mess with its
// old state
std::istringsteram ss(line);
ss >> unsortedArray[i].record;
ss >> unsortedArray[i].quantity;
ss >> unsortedArray[i].cost;
i++;
【讨论】:
以上是关于从文件填充数组时,Visual Studio 中止的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 中,当为 Apache Cordova 使用 remotebuild 时,Plugins 文件夹不会填充
Base64 汇编程序填充数组错误“操作数不同大小”Visual Studio
Visual Studio 2019 - msvsmon.exe 意外退出。 .net core 1.1 项目将中止调试