【问题标题】:C++- File managing - Output one word per lineC++ - 文件管理 - 每行输出一个单词
【发布时间】:2016-08-31 14:24:23
【问题描述】:

我是论坛的新手,如果我做错了什么,请原谅我。我有点着急,我什至无法翻译我在这段代码中写的内容。我创建了文件并且它可以工作,我添加新记录并且它可以工作,我还打印所有文件并且它可以工作。所以,问题是 void cl()。我给一个教室作为输入,它应该给我那个教室里的学生作为输出,问题是这不起作用,实际上有时它会多次打印一个学生和同一个教室。我该怎么办?请记住,我没有对文件做太多事情,所以如果有一种简单的方法可以解决这个问题,我会更喜欢它,但我接受所有可能的帮助。谢谢! 编辑:我也忘了说我有一些奇怪的警告信息,比如“[警告]未知转义序列:'\D'”和\S。这适用于每个空白,我认为它与文件名有关,但这是一个问题吗?

#include <iostream>
#include <string>
#include <cstdlib>
#include<fstream>
using namespace std;
string nome, classe;
ofstream fout;
ifstream fin;

void crea(){ /*this is the file creation*/
    cout<<"-----------------------"<<endl;
    char risp;
    fout.open("C:\Documenti\studenti.txt",ios::out);
    do{
       cout<<"Inserisci nome: "<<endl;
       cin>>nome;
       cout<<"Inserisci classe: "<<endl;
       cin>>classe;
       fout<<nome<<" "<<classe<<endl;
       cout<<"un altro record (s/n): "<<endl;
       cin>>risp;
   }while(risp=='s');
   fout.close();
   cout<<"--------------------------------"<<endl;
}

void aggiungi(){ /*this adds new records to the file*/
    cout<<"----------------------"<<endl;
    char risp;
    fout.open("C:\Documenti\studenti.txt", ios::out | ios::app);
    do{
        cout<<"Inserisci nome: "<<endl;
        cin>>nome;
        cout<<"Inserisci classe: "<<endl;
        cin>>classe;
        fout<<nome<<" "<<classe<<endl;
        cout<<"Un altro record (s/n)?"<<endl;
        cin>>risp;
   }while(risp=='s');
   fout.close();
   cout<<"-------------------------"<<endl;
 }


 void visualizza(){ /*this prints all the file on the video*/
    cout<<"--------------------------"<<endl;
    fin.open("C:\Documenti\studenti.txt",ios::in);
    if(!fin)
        cout<<"File inesistente, impossibile procedere. "<<endl;
    else{
        fin>>nome>>classe;
         while(!fin.eof()){
              cout<<nome<<" "<<classe<<endl;
              fin>>nome>>classe;
         }
         cout<<"----------------------------"<<endl;
         fin.close();
   } 
}


 void cl(){ /*this SHOULD work like i say in the description*/
    cout<<"--------------------------"<<endl;
    string cla;
    fin.open("C:\Documenti\Studenti.txt",ios::in);
    if(!fin)
       cout<<"File inesistente, impossibile procedere. "<<endl;
    else{
        cout<<"Inseire classe per sapere i nomi degli studenti: "<<endl;
        cin>>cla;
        cout<<"**********************************"<<endl;
        fin>>nome;
        while(!fin.eof()){
           if(cla==classe){
              cout<<nome<<endl;
              fin>>nome;
           }
        }------------------"<<endl;
  }
}

int esci(){ /*this is the exit status*/
    char risp;
    cout<<"Hai selezionato l'opzione 'esci', sei sicuro? s/n "<<endl;
    cin>>risp;
}

int main(){ /*main with menu*/
    int n;
 do{
    cout<<"Scegliere cosa fare: "<<endl;
    cout<<"1) Creare il file con classi e nomi degli studenti. "<<endl;
    cout<<"2) Aggiungere ulteriori studenti."<<endl;
    cout<<"3) Visualizzare classe e nome di ogni studente. "<<endl;
    cout<<"4) Visualizzare tutti gli studenti di una data classe. "<<endl;
    cout<<"5) Esci. "<<endl;
    cin>>n;
    switch(n){
       case 1:
          crea();
          break;
       case 2:
          aggiungi();
          break;
       case 3:
          visualizza();
          break;
       case 4:
          cl();
          break;
       case 5:
          esci();
          break;
       default:
          system("pause");
          return 0;     
   }
 }while(n!=5);

}

【问题讨论】:

  • 欢迎来到 Stack Overflow!听起来您可能需要学习如何使用调试器来逐步执行代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs
  • 你好 Nathan,我也忘了说我有一些奇怪的警告信息,比如“[Warning] Unknown escape sequence: '\D'”和 \S。这适用于每个空白,我认为它与文件名有关,但这是一个问题吗?
  • 这是因为在像"C:\Documenti\studenti.txt" 这样的字符串文字中,\ 是一个特殊字符,需要用另一个\ 转义,比如"C:\\Documenti\\studenti.txt"
  • 我尝试使用 \\ 但它似乎此时没有创建文件。在它用来创建它之前。

标签: c++ file output


【解决方案1】:

根据我的解释,您的文件以这种格式存储信息:_

nome1 classe1

nome2 classe2

...

...

...

由于文件从流中读取数据,它将提取流中可用的下一个字符串。 在您的代码中,不会从文件中读取类,并且将与类对应的文本输入到 nome 中,这解释了荒谬的输出。此外,在更新 nome 时,您应该在 if 部分之外执行此操作,因为无论如何都必须读取文件,无论是否该类是否与 cla 匹配。 看看这段代码:-

void cl(){ 
cout<<"--------------------------"<<endl;
string cla;
fin.open("C:\Documenti\Studenti.txt",ios::in);
if(!fin)
   cout<<"File inesistente, impossibile procedere. "<<endl;
else{
    cout<<"Inseire classe per sapere i nomi degli studenti: "<<endl;
    cin>>cla;
    cout<<"**********************************"<<endl;
    while(!fin.eof()){
       fin>>nome>>classe;//change here
       if(cla==classe){
          cout<<nome<<endl;
       }
    }------------------"<<endl;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多