C++ C++;从用户给定的文件中读取
我正在创建一个简单的目录程序,允许用户输入文件名并按名称、地址或电话号码搜索该文件。我在正确读取文件时遇到问题 如果有人能给我建议如何修复我的C++ C++;从用户给定的文件中读取,c++,ifstream,C++,Ifstream,我正在创建一个简单的目录程序,允许用户输入文件名并按名称、地址或电话号码搜索该文件。我在正确读取文件时遇到问题 如果有人能给我建议如何修复我的getFirstName函数。函数应该读取文件的第一个字 示例文件: Bob Smith 123456789 123 Main Street Susan Smith 1224445555 543 Market Street 这是我到目前为止的部分代码 string file; string first; int main() { ifst
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";
}
}
字符串文件;
先串;
int main(){
河流充填;
cout文件;
inFile.open(文件);
if(inData.fail()){
coutf;
}
if(file.bad()){
我不会给你写程序,但让我给你指出一个方向
首先:请更好地格式化你的代码。也许这只是因为stackoverflow,但是你的代码应该有一致的和有意义的格式化,否则你和其他人不能很好地阅读它,并且很难找到问题。(请使用google clang format作为工具,也许ide也可以)
将程序拆分为不同的逻辑部分。我的方法是:
打开文件,如果不可能,发出警告,结束程序
将文件内容读入:文件名,读出:内容字符串
将字符串拆分为行,IN:string,OUT:std::vector
对于每一行,将该行拆分为多个部分(3个元素?)IN:linestring,OUT:name,street
您可以在适当的数据结构中看到好的STL
访问您的数据结构以获取所需信息
关于你的数据的建议
- 我想要文件,你有吗
- 文件内容的字符串
- 行文件内容的std::vector
- 无序映射将名称映射到信息
这应该给你一个谷歌搜索的开始。每个子问题都可以独立解决(并进行测试),而且更容易在上面找到:)
祝你好运。我同意这些评论。但要回答你的问题“函数应该读取文件的第一个单词”。下面是如何从文件中读取第一个单词的一般想法:
...
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!在开始编程之前,您必须确定要读取的文件的确切格式。该格式为您提供了从文件读取的操作顺序
在您的示例中,您给出:
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
是您打算将实际行复制到的变量
例如:
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.
<> P>一个有趣的怪癖是,你不必担心手动告诉C++文件中你想查找数据的地方。当文件被读取时,指针会自动保存在从下一个开始读的文件流中。当你得到一个单词时,指针会在下一个单词的开头自动开始,所以你只需在下一个单词的开头就可以开始。继续线性拖动数据,直到到达文件末尾。void getFirstName(字符串f,infle文件);
应为void getFirstName(字符串f,ifstream infle);
请记住,在变量类型和名称之间加上一个符号(&),以避免创建文件副本(消耗更多ram),只有在您希望对变量进行不应保留的更改时,才可以使用不加符号
字符串f是在哪里定义的?你调用函数时没有传递f,但是它被用在函数中。这是一个严重的问题
如果我没记错的话,ifstream.good()函数不能接受参数
如果您试图找到f(您没有告诉我们它是什么,所以我不能更准确地说),那么您应该首先了解f应该是一个文件(因为您使用了file.open(f);
),将值传递给字符串,然后在执行infle>>命名您的字符串之后;
doIf(name\u of\u your\u string==f){/*读取的最后一个字对应于f*/}
类型为ifstream,变量名为infle。
另外,由于getFirstName是在main之后定义的,所以必须将它放在mainvoid getFirstName(string f,ifstream infle)之前;
这称为原型,它告诉编译器函数在main之后
显然,不要删除函数的其余部分。如果这是一个问题,请将main移到它下面。此外,如果有人在输入中放入空格,则在最后一个空格丢失之前,请删除cin>>文件;
并使用getline(cin,file);
请记住更新答案,提供更多关于f是什么以及您希望它做什么的详细信息
编辑:请记住在停止读取文件后使用infle.close();
,以避免细微错误。您的代码中存在大量语法问题。逐个检查并修复它们。请注意infle
是一个变量,而不是一种类型。您无法发送inFi