2012-01-14 18 views
22

tengo este código:función de escritura simple de archivos en C++

// 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; 
} 

¿Por qué esto no funciona? me da el error:

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 ========== 

y esto es solo una función simple. Estoy usando Visual Studio 2010.

+1

¿Por qué agregó la etiqueta 'c' cuando obviamente está escribiendo código C++? –

Respuesta

5

Es necesario declarar la prototipo de su función writeFile, antes de utilizarlo:

int writeFile(void); 

int main(void) 
{ 
    ... 
+0

me da la idea, hay tantos idiomas, por lo que no es ** public static void main() ** y ** public void functionName() ** ... hmm interesting – Master345

+0

Esas son funciones, no métodos (funciones miembro de clase).Entonces no hay un concepto 'público' aquí. 'static' se puede usar para una función, lo que significa que será privada para el archivo. Tenga en cuenta que no puede hacer esto para 'main', por supuesto. – Macmade

+0

¿no hay un concepto público? ¿qué hay de público: y privado:? – Master345

8

Su main no sabe de writeFile() y no puede llamar eso.

Mover writefile sea antes main, o declarar una function prototypeint writeFile();main antes.

38

Existen dos soluciones para esto. Usted puede colocar el método anterior el método que llama:

// 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(); 
} 

o declarar un prototipo:

// 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; 
} 
+0

me da la idea, hay tantos idiomas, por lo que no es ** public static void main() ** y ** public void functionName() ** ... hmm interesante ... y esa parte para poner ** main() ** al final es hilarante – Master345

+8

¿Por qué es "gracioso" poner la función principal al final? ¿Y qué hay en el mundo 'public static void main()'? ¿Qué tiene eso que ver con esto? –

+0

@Row Minds La idea esencial aquí es que cuando llamó a writeFile() desde main, la función writeFile aún no se ha declarado, de ahí las soluciones anteriores. –

0

cambiar el orden de las funciones o hacer una declaración adelantada de la función writefiles y será trabajo, creo

2

Este es un lugar en el que C++ tiene una regla extraña. Antes de poder compilar una llamada a una función, el compilador debe conocer el nombre de la función, el valor de retorno y todos los parámetros. Esto se puede hacer agregando un "prototipo". En su caso esto significa simplemente añadiendo antes main la siguiente línea:

int writeFile(); 

esto le dice al compilador que existe una función llamada writeFile que será definido en alguna parte, que devuelve un int y que no acepta parámetros.

Como alternativa, puede definir primero la función writeFile y luego main porque en este caso cuando el compilador llega a main ya conoce su función.

Tenga en cuenta que este requisito de conocer de antemano las funciones a las que se llama no siempre se aplica. Por ejemplo, para miembros de la clase definida en línea no se requiere ...

struct Foo 
{ 
    void bar() 
    { 
     if (baz() != 99) 
      std::cout << "Hey!"; 
    } 

    int baz() 
    { 
     return 42; 
    } 
}; 

En este caso, el compilador no tiene problemas en el análisis de la definición de bar incluso si depende de una función baz que se declara más adelante en el código fuente.

+0

lo entiendo, pero es una regla extraña ... y pensar en cualquier lenguaje tiene muchas reglas extrañas, maldita sea ... – Master345

+2

@RowMinds: C++ no es el resultado de un diseño limpio de página blanca, sino que viene de un largo historia de la evolución que incluso pasó por un comité (y esto solo puede eliminar la belleza de ** cualquier cosa **). En muchas partes, lamentablemente, el resultado es bastante sorprendente y aparentemente ilógico ... esto también significa que no puedes confiar en tu intuición cuando aprendes C++ y debes estudiarlo en su lugar. Es un lenguaje agradable y poderoso, pero está lleno de reglas extrañas (que a menudo solo existen por razones históricas). – 6502

+0

sé C++ es viejo, pero en serio C++ <<<<<<<<<<< C# en serio ... – Master345

1

La declaración de la función int writeFile(); parece que falta en el código. Agregar int writeFile(); antes de la función main()

Cuestiones relacionadas