我正在创建一个简单的目录程序,允许用户输入文件名并按名称,地址或电话号码搜索该文件。我无法正确阅读该文件。
如果有人可以就如何解决我的getFirstName
功能提供建议。该函数应该读取文件的第一个单词。
示例文件:
Bob Smith 123456789
123 Main Street
Susan Smith 1224445555
543 Market Street
到目前为止,这是我的代码的一部分。
string file;
string first;
int main() {
ifstream inFile;
cout<<"Enter file name: ";
cin>> file;
inFile.open(file);
if(inData.fail()) {
cout<<"INVAILD";
}
getFirstName(first);
}
void getFirstName(string f, inFile file) {
file.open(f);
while(file.good(f)) {
file>>f;
}
if (file.bad()) {
cout<<"Name not found";
}
}
答案 0 :(得分:1)
我不会给你写这个节目,但是让我指出你的方向。
首先:请更好地格式化代码。也许它只是因为stackoverflow,但应该有一致和有意义的代码格式,否则你和其他人不能很好地阅读它,并找不到问题。 (PLZ google clang-format for a tool,也许是ide也会这样做。)
将您的程序拆分为不同的逻辑部分。我的方法是:
建议您的数据。
这应该给你一个谷歌搜索开始。每个子问题都可以独立解决(并经过测试),更容易在SO上找到:)
祝你好运。答案 1 :(得分:0)
我同意这些意见。然而要回答你的问题&#34;该函数应该读取文件的第一个单词。&#34;下面是如何从文件中读取第一个单词的一般概念:
...
ifstream inFile; // define your input stream
string firstwrd; // first word
inFile.open("yourfile"); // open your file
inFile>> firstwrd; // this will read the first word
inFile.close(); // close the file
...
请考虑阅读乔纳斯的评论。
编辑:请注意我的答案绝不是从文件中读取最佳做法的权威教程。它适用于您的具体案例。
HTH!
答案 2 :(得分:0)
在开始编程之前,您必须确定要读取的文件的确切格式。该格式为您提供了打算如何从文件中读取操作的操作顺序。
在您的示例中,您给出:
Bob Smith 123456789
123 Main Street
Susan Smith 1224445555
543 Market Street
分为以下格式:
[First Name] [Last Name] [User ID (I assume)]\n
[Address]
现在我们已经建立了,我们要做的第一件事就是打开文件流。
ifstream file("path\\to\\file");
从文件流中检索信息时,有两种标准方法:>>
运算符和getline()
。
>>
运算符将给定fstream
中的下一个文本块返回到任何空格字符,例如空格,换行符或返回字符。其语法为file >> var
,其中file
是您要读取的fstream
,var
是您要写入的变量。
getline()
函数将返回整行,包括空格,但会在返回和换行符处停止。函数的实际语法是std::getline(read, write);
,其中read
是您要实际读取的文件流或字符串,write
是您要将实际行复制到的变量。
例如:
ifstream file("file.txt");
string firstname, lastname, id, address;
file >> firstname; //get the first word of the file.
file >> lastname; //get the second word of the file.
file >> id; //get the third word of the file.
getline(file, address); //Get the next whole line of the file, regardless of how many words.
一个有趣的怪癖是,您不必担心手动告诉C ++您想要查找数据的文件中的哪个位置。在读取文件时,指针会自动保留在文件流的内部,从下一个开始读取的位置。当你得到一个单词时,指针会自动从下一个单词的开头开始,所以你只需要线性地拉数据,直到你到达文件的末尾。
答案 3 :(得分:0)
void getFirstName(string f, inFile file);
应为void getFirstName(string f, ifstream inFile);
。
请记住,在变量类型和名称之间添加&符号(&amp;)以避免创建文件的副本(消耗更多ram),如果你想要的话,不要使用&符号是合理的对不应该留下的变量进行更改。
字符串f在哪里定义?您可以在不传递f的情况下调用该函数,但它已在函数中使用。这是严重的问题。
ifstream.good()函数如果我没记错,就不能参数。
如果你试图找到f(你没有告诉我们它是什么,所以我可以更精确)那么你应该首先明白f应该是一个文件(因为你使用file.open(f);
),将值传递给字符串,然后执行inFile >> name_of_your_string;
执行if (name_of_your_string == f) { /* the last word read corresponds to f */}
。
类型是ifstream,变量的名称是inFile。
此外,因为getFirstName是在main之后定义的,所以你必须将它放在main void getFirstName(string f, ifstream inFile);
之前,这称为原型,它告诉编译器该函数在main之后。
显然,不要删除剩下的功能。如果这对你来说是一个问题,那就移动它。此外,如果有人在输入中放入空格,最后一个空格将丢失,请删除cin >> file;
并使用getline (cin, file);
请记住更新答案,详细了解f是什么以及您希望它做什么。
编辑:请在停止阅读文件后使用inFile.close();
以避免细微错误。