Print last entered date from .txt file

  • Thread starter Thread starter tebes
  • Start date Start date
  • Tags Tags
    File
Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
5 replies · 2K views
tebes
Messages
38
Reaction score
0

Homework Statement


How do I retreat the last entered data from .txt file ?
Code:
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std; 
void menu(int *);
void option(fstream &, int *);
int main()
{
    int a, p; 
    while(a== 1||2||3||4||5 ) 
    {
    menu(&a);
    fstream myfile; 
    myfile.open("music.txt" , ios::app | ios::out);
    myfile.close();
    p=a;
    option(myfile, &p);
    }
    system("pause");
    return 0; 
}
void menu(int *e)
{
     cout<<"\n\nMusic index list \n"
         <<"---------------- \n"
         <<"1. Add new song title to index list file \n"
         <<"2. Print most recently added song title in index list file \n"
         <<"3. Print all the items from the index list file \n"
         <<"4. Delete all of the items on the index list file \n"
         <<"5. Quit \n\n";
     cin>>*e;
     cout<<endl<<endl;
}
void option(fstream &myfile, int *p)
{
     char ch; 
     string line; 
     int pass; 
     
     switch (*p)
     {
            case 1: 
                 {
                 myfile.open("music.txt", ios::app | ios::out);
                 cout<<"Please end the title with a period . \n";
                 cout<<"What is the new title ?\n ";
                 cin.get(ch);
                 while (ch != '.')
                 {
                       myfile.put(ch);
                       cin.get(ch);
                 }
                 myfile.put(ch);
                 myfile.close();
                 break; 
                 }
            case 2:
                 {
                 myfile.open("music.txt", ios::out);    //Need to print the last song title from the file
                 
                 myfile.close();
                 break; 
                 }
            case 3:
                 {
                 cout<<"My music: \n";
                 myfile.open("music.txt");
                 if (myfile.is_open())
                 {
                 while (myfile.good())
                 {
                 getline (myfile, line);
                 cout<<line<<endl;
                 } 
                 myfile.close();
                 }
                 else cout<<"Unable to open file.\n";
                 break; 
                 }
            case 4:
                 {
                 cout<<"Warning, confirm to delete.\n"
                     <<"Please press 1. \n";
                 cin>>pass; 
                 if(pass==1)
                 {
                 myfile.open("music.txt", ios::out);
                 cout<<"Data deleting...\n";
                 myfile.close();
                 }
                 else
                 cout<<"Try again.\n";
                 break; 
                 }
            case 5:
                 {
                 cout<<"warning, program to be closed.\n";
                  exit(0);
                  }
     }
}
 
Last edited by a moderator:
Physics news on Phys.org
Are you asking how to retrieve the last-entered song title? If so, you could write a while loop that reads and saves in a variable a line of data at a time from the file (using ifstream::getline()). The loop should run until ios::eof() returns true. When ios::eof() returns true, you have reached the end of the file, and the variable holds the last string that was read.

Some comments on your code:
1) a, p, and e are really dumb names for variables. It's impossible to tell what they are supposed to represent. Use longer names that are more explanatory.
2) This code doesn't do what you think it's doing.
Code:
while(a== 1||2||3||4||5 ) 
{
   ...
}
The while loop will continue executing if a is any positive integer. You need to check the boolean expressions separately: (a == 1) || (a == 2) || etc.

3. Why are you opening the music.txt file so many times? I count five calls to myfile.open( ... ).

4. Your fourth menu item (delete the file) doesn't do anything useful. Maybe you just don't have that fully implemented yet.
 
Mark44 said:
Are you asking how to retrieve the last-entered song title? If so, you could write a while loop that reads and saves in a variable a line of data at a time from the file (using ifstream::getline()). The loop should run until ios::eof() returns true. When ios::eof() returns true, you have reached the end of the file, and the variable holds the last string that was read.

Some comments on your code:
1) a, p, and e are really dumb names for variables. It's impossible to tell what they are supposed to represent. Use longer names that are more explanatory.


2) This code doesn't do what you think it's doing.
Code:
while(a== 1||2||3||4||5 ) 
{
   ...
}
The while loop will continue executing if a is any positive integer. You need to check the boolean expressions separately: (a == 1) || (a == 2) || etc.


3. Why are you opening the music.txt file so many times? I count five calls to myfile.open( ... ).


4. Your fourth menu item (delete the file) doesn't do anything useful. Maybe you just don't have that fully implemented yet.

Thank you for you suggestion. Those tips really helpful. I'm still a beginner.


Reply 1 : I agree with you. Those are really dumb variables. I apologize for giving trouble to you or whoever who read this codes.

Reply 2 : You are right. Thank you so much.

Reply 3 : The reason I open multiple of myfile.open(), is to put different access flag , to carry out their specific function.

Reply 4 : The fourth menu option is to clear the entered items on .txt .
 
tebes said:
Reply 3 : The reason I open multiple of myfile.open(), is to put different access flag , to carry out their specific function.
I see that, but you still might be opening the file more than you need to. I don't think that you need to open the file in main() at all, since you are opening it several times in your option function.
tebes said:
Reply 4 : The fourth menu option is to clear the entered items on .txt .
But it says it is deleting the items in the file, but all it really does is close the file.
Code:
case 4:
{
    cout<<"Warning, confirm to delete.\n"
    <<"Please press 1. \n";
    cin>>pass; 
    if(pass==1)
   {
       myfile.open("music.txt", ios::out);
       cout<<"Data deleting...\n";
       myfile.close();
   }
   else
       cout<<"Try again.\n";
   break;
}
 
Mark44 said:
I see that, but you still might be opening the file more than you need to. I don't think that you need to open the file in main() at all, since you are opening it several times in your option function.

But it says it is deleting the items in the file, but all it really does is close the file.
Code:
case 4:
{
    cout<<"Warning, confirm to delete.\n"
    <<"Please press 1. \n";
    cin>>pass; 
    if(pass==1)
   {
       myfile.open("music.txt", ios::out);
       cout<<"Data deleting...\n";
       myfile.close();
   }
   else
       cout<<"Try again.\n";
   break;
}

"I see that, but you still might be opening the file more than you need to. I don't think that you need to open the file in main() at all, since you are opening it several times in your option function."

Reply: I was requested to do that , by my professor. ^.^ I am sorry for ambiguousness . Thank you, by the way.

But it says it is deleting the items in the file, but all it really does is close the file.
Code:
case 4:
{
    cout<<"Warning, confirm to delete.\n"
    <<"Please press 1. \n";
    cin>>pass; 
    if(pass==1)
   {
       myfile.open("music.txt", ios::out);
       cout<<"Data deleting...\n";
       myfile.close();
   }
   else
       cout<<"Try again.\n";
   break;
}

Reply: I thought access flag " ios::out", was supposed to erase everything on the .txt when the program runs
 
tebes said:
Reply: I thought access flag " ios::out", was supposed to erase everything on the .txt when the program runs
OK, I think you're right. If you open a file for output, that effectively wipes out the previous contents of the file.