简体   繁体   中英

C++ writing to file error in Linux/Ubuntu?

I have been trying to learn C++ recently, but I have stumbled across some errors. For example, when I try to run this code to ask the user what they want outputted to a file:

#include <iostream>
#include <cstdio>

using namespace std;

    main() {
        string output; //Declare variables before starting
        FILE * file = fopen("newfile.txt","w"); //creates file
        cout << "Entire something that you want to be written to the file: " << endl;
        cin.getline(output, 256);  //Asks what you want to put into file
        fprintf(file, output); //Puts output into file
        fclose(file);   //closes file
        return 0;
    }

using

g++ -o main test.cpp

I get this error:

test.cpp: In function ‘int main()’:
test.cpp:10:25: error: no matching function for call to ‘std::basic_istream<char>::getline(std::string&, int)’
  cin.getline(output, 256);
                         ^
test.cpp:10:25: note: candidates are:
In file included from /usr/include/c++/4.8/iostream:40:0,
                 from test.cpp:1:
/usr/include/c++/4.8/istream:618:5: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(std::basic_istream<_CharT, _Traits>::char_type*, std::streamsize, std::basic_istream<_CharT, _Traits>::char_type) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::char_type = char; std::streamsize = long int]
     basic_istream<char>::
     ^
/usr/include/c++/4.8/istream:618:5: note:   candidate expects 3 arguments, 2 provided
/usr/include/c++/4.8/istream:427:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::getline(std::basic_istream<_CharT, _Traits>::char_type*, std::streamsize) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>; std::basic_istream<_CharT, _Traits>::char_type = char; std::streamsize = long int]
       getline(char_type* __s, streamsize __n)
       ^
/usr/include/c++/4.8/istream:427:7: note:   no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘std::basic_istream<char>::char_type* {aka char*}’
test.cpp:11:22: error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘const char*’ for argument ‘2’ to ‘int fprintf(FILE*, const char*, ...)’
  fprintf(file, output);
                      ^

Could someone please help me? And please forgive me if this is something that can be easily solved, I am fairly new to C++ and do not quite understand it yet.

The header for string is missing:

#include <string>

Without it, sring isn't defined, and everywhere you use output, you'll have errors

With the include you'll have a lot less errors. But this line has another issue (as πάντα ῥεῖ already pointed out):

cin.getline(output, 256); 

because cin.getline() expects a char* and the length. If you want to use a string, you have to use the function getline() , without size (limited to strings maximume size) and on an istream:

 getline(cin, output); 

Last remark: you are of course free to mix c-style io and streams. But you could win from getting used to streams for all your file io .

The error occurs at the line

cin.getline(output, 256);

According to the documentation for std::istream::getline , the first argument for cin.getline() should be a char * and not a std::string as you have declared it.

Try changing the declaration of output to a char * like so

char[256] output;

Edit: Using std::getline as the others have said would be a better idea though.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM