Простая функция записи файла в С++
У меня есть этот код:
// basic file operations
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
writeFile();
}
int writeFile ()
{
ofstream myfile;
myfile.open ("example.txt");
myfile << "Writing this to a file.\n";
myfile << "Writing this to a file.\n";
myfile << "Writing this to a file.\n";
myfile << "Writing this to a file.\n";
myfile.close();
return 0;
}
Почему это не работает? это дает мне ошибку:
1>------ Build started: Project: FileRead, Configuration: Debug Win32 ------
1> file.cpp
1>e:\documents and settings\row\my documents\visual studio 2010\projects\fileread\fileread\file.cpp(8): error C3861: 'writeFile': identifier not found
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
и это просто простая функция. Я использую Visual Studio 2010.
Ответы
Ответ 1
Существует два решения. Вы можете поместить метод выше метода, который его вызывает:
// basic file operations
#include <iostream>
#include <fstream>
using namespace std;
int writeFile ()
{
ofstream myfile;
myfile.open ("example.txt");
myfile << "Writing this to a file.\n";
myfile << "Writing this to a file.\n";
myfile << "Writing this to a file.\n";
myfile << "Writing this to a file.\n";
myfile.close();
return 0;
}
int main()
{
writeFile();
}
Или объявите прототип:
// basic file operations
#include <iostream>
#include <fstream>
using namespace std;
int writeFile();
int main()
{
writeFile();
}
int writeFile ()
{
ofstream myfile;
myfile.open ("example.txt");
myfile << "Writing this to a file.\n";
myfile << "Writing this to a file.\n";
myfile << "Writing this to a file.\n";
myfile << "Writing this to a file.\n";
myfile.close();
return 0;
}
Ответ 2
Ваш main
не знает о writeFile()
и не может его вызывать.
Переместить writefile
до main
или объявить прототип функции int writeFile();
до main
.
Ответ 3
Вам нужно объявить прототип вашей функции writeFile
, прежде чем использовать его:
int writeFile( void );
int main( void )
{
...
Ответ 4
Это место, где С++ имеет странное правило. Перед тем, как компилировать вызов функции, компилятор должен знать имя функции, возвращаемое значение и все параметры.
Это можно сделать, добавив "prototype". В вашем случае это просто означает добавить до main
следующую строку:
int writeFile();
это сообщает компилятору, что существует функция с именем writeFile
, которая будет определена где-то, которая возвращает int
и которая не принимает никаких параметров.
В качестве альтернативы вы можете сначала определить функцию writeFile
, а затем main
, потому что в этом случае, когда компилятор добирается до main
, уже знает вашу функцию.
Обратите внимание, что это требование заранее знать, что вызываемые функции не всегда применяются. Например, для членов класса, определенных в строке, он не требуется...
struct Foo
{
void bar()
{
if (baz() != 99)
std::cout << "Hey!";
}
int baz()
{
return 42;
}
};
В этом случае у компилятора нет проблем с анализом определения bar
, даже если он зависит от функции baz
, которая объявлена позже в исходном коде.
Ответ 5
Объявление функции int writeFile(); кажется, отсутствует в коде.
Добавить int writeFile(); перед функцией main()
Ответ 6
Переключить порядок функций или сделать прямое объявление функции writefiles, и он будет работать, я думаю.