我有一个txt文件,其中包含学生的姓名和卷号。我想从他的文件中读取并显示特定的卷号。它仅显示第一个卷号,但我想读取第二个人的卷号。
也就是说,如果我想读取“ss”的卷号,它会显示第一个人的卷号
该计划
#include<iostream.h>
#include<conio.h>
#include<fstream.h>
#include<string.h>
#include<stdio.h>
void student_read()
{
clrscr();
char name[30], n[30], temp[30];
int i, roll_no, code, count=0;
ifstream fin("tt.txt",ios::in|ios::beg);
if(!fin)
{
cout << "cannot open for read ";
return;
}
cout << "Enter the name of student" << "\n";
cin >> n;
while(fin >> name >> roll_no)
{
cout << roll_no << endl;
}
if(string[name] == string[n])
{
cout << "roll no" << "\n" << roll_no;
}
else
cout << "Not found";
}
void main()
{
clrscr();
cout << "Students details is" << "\n";
student_read();
getch();
}
txt文件包含以下数据:
sourav 123 SS 33
答案 0 :(得分:3)
你的文本文件中是否有每一行的结尾?你有sourav 123 ss 33
或sourav 123\nss 33
吗?这个if(n[30]==name[30])
只比较字符串中的1个字符。
答案 1 :(得分:2)
在您输入要搜索的名称之前,您已经在输出文件中的内容。
重新排序语句,如下所示:
cout<<"Enter the name of student"<<"\n";
cin>>n;
while(fin>>name>>roll_no)
{
//...
另外,如果只想要输出一个名称和roll_no,在循环中,你必须检查某种条件是否打印。目前,您的代码实际上应该打印文件中所有行的roll_no,有时可能打印最后一次的两次。
因此输入后的条件属于循环。
此外,你只是比较char数组的第31个字符(它实际上已经超出了数组变量的范围!它们的索引从0..29开始,即使你分配了30个字符数组,)。这意味着,如果倒数第二个字符匹配,则您的条件为真。这个地方很可能还没有初始化,所以你比较基本的gargabe值,并得到意外/随机的结果。
如果你想要,如描述所示,想要比较整个char数组,它的工作方式不同(不是使用==运算符,只能比较指针地址),你需要使用strcmp
功能。但更好的方法是使用std::string
代替char *
。
答案 2 :(得分:1)
void student_read()
{
clrscr();
std::string name, n, temp;
int i, roll_no, code, count = 0;
std::ifstream fin("tt.txt", ios::in | ios::beg);
if (!fin)
{
std::cout << "cannot open for read ";
return;
}
std::cout << "Enter the name of student" << "\n";
std::cin >> n;
while (fin >> name >> roll_no)
{
std::cout << roll_no << std::endl;
}
if (name == n)
{
std::cout << "roll no" << "\n" << roll_no;
}
else
std::cout << "Not found";
}
int main()
{
clrscr();
std::cout << "Students details is\n";
student_read();
getch();
}