有人可以解释一下为什么在从数据文件读入时只删除第一个字母但仅在数组的1/2/3部分而不是0部分? (对不起真的不知道怎么解释)(我只会包括我得到的部分以及数据文件)
我得到什么
GoogleyleSmith01@gmail.comyleman27安全问题:带手表的白兔子 Deviantartragonmaster27andalfthegreyNULL
它应该是什么
GoogleKyleSmith01@gmail.comKyleman27securityquestion:Whiterabbitwithawatch DeviantartDragonmaster27GandalfthegreyNULL
原始数据文件
Google; KyleSmith01@gmail.com; Kyleman27;安全问题:带手表的白兔; deviantART的; Dragonmaster27; Gandalfthegrey; NULL;
我不会包含所有代码,因为它与此问题无关
#include<iostream>
#include <fstream>
#include <string>
#include <vector>
#include<sstream>
using namespace std;
const int NCOLS = 4;
const int NROWS = 10;
void description_and_options(string data[][NCOLS], int count[NCOLS]);
void available_options();
void view_line_data(int choice,string data[][NCOLS]);
int main()
{
ifstream file_name;//create the new file
string user_input_file;//the files name inputed by the user
int stringlength;
string read_in_array[NROWS][NCOLS];
string line;
int counter[10] = { 1,2,3,4,5,6,7,8,9,10 };
string user_option_choice;
string small_exit = "x";
string large_exit = "X";
int view_choice;
cout << "Enter the name of the input file: ";
cin >> user_input_file;
if (user_input_file.length() > 4)// check to see if its more than 4 in length
{
stringlength = user_input_file.length(); //saves length
if (user_input_file.substr(stringlength - 4, 4) == ".txt")//checks to see if its .dat
{
file_name.open(user_input_file.c_str());
if (file_name.fail())
{
cerr << "The file " << user_input_file << " failed to open.\n";//tells user if it fails
exit(1);
}
}
}
else
{
user_input_file += ".txt";//adds .dat to non .dat
file_name.open(user_input_file.c_str());
}
if (file_name.fail())
{
cout << "File failed to open" << endl;
system("PAUSE");
exit(1);
}
for (int row = 0; row <= 9; row++)
{
for (int col = 0; col < 4; col++)
{
if (getline(file_name, line, ';'))
{
file_name.ignore(1, '\n');
read_in_array[row][col] = line;
cout << read_in_array[row][col];
}
}
cout << endl;
}
//[updown][leftright]
file_name.close();
无论如何都可以在不完全更改代码的情况下修复此问题吗?
答案 0 :(得分:1)
它忽略了第一个字符,因为你告诉它
file_name.ignore(1, '\n');
每次调用getline
后,将忽略流中的第一个字符。看起来你这样做是因为你认为文件中的;
仍然存在。关于getline
,您需要记住的是它丢弃了您使用的分隔符。这意味着它会在找到;
之前读取,然后将;
抛出。这意味着你不需要忽略它,因为它不再存在。
仅删除对ignore
的调用不足以解决问题。由于您尝试解析整行,我们需要将该行读入stringstream
,然后在流上调用getline
以获取各个部分。这是因为只需阅读;
即可获取换行符。
代码的快速重构会给你一些看起来像
的东西for (int row = 0; row <= 9; row++)
{
std::string temp;
std::getline(file_name, temp)
std::stringstream ss(temp)
for (int col = 0; col < 4; col++)
{
if (getline(ss, line, ';'))
{
read_in_array[row][col] = line;
cout << read_in_array[row][col];
}
}
cout << endl;
}
答案 1 :(得分:0)
您使用错误的ifstream :: ignore()。
从输入序列中提取字符并丢弃它们,直到 n个字符已被提取,或者一个比较等于 DELIM。
file_name.ignore(1, '\n');
总是拒绝第一个字母。在你的情况下,“;”之后的第一个字母在线。
答案 2 :(得分:0)
file_name.ignore(1, '\n');
将使流忽略输入中的一个字符。
阅读您的代码:
ignore
在循环中的第一个getline
之前尚未被调用。ignore
语句使流跳过下一个字符