Buenas, tengo la siguiente práctica que realizar en C++ y hay ciertas partes que no me salen.

Crear un programa para generar de forma aleatoria un fichero de texto formado por un número de líneas entre 1 y 10000 que pasaremos como argumento al ejecutar el programa. Sus líneas han de contener los siguientes campos:
un nombre (cadena aleatoria),
apellidos (cadena aleatoria),
edad (numero aleatorio entre 0 y 120),
dni (numero aleatorio entre 0 y 10000 que no puede aparecer repetido en el fichero).
Si la llamada al programa no tiene argumentos el programa ha de mostrar un menú con las siguientes opciones:
Opcion 1: búsqueda de usuario con un determinado dni. Al elegir esta opción el programa ha de buscar si existe en el fichero alguna linea con ese dni y una vez encontrada nos ha de mostrar el resto de campos de la línea donde aparece.
Opción 2: listado de edad, dni, nombre y apellidos ordenados por edad.
Opción 3: Salir del programa.Mi código es el siguiente, y con comentarios comento mis problemas: (no sé porque no se mantiene la identación, si lo he pegado después de poner los tags

)
Spoiler
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;
void cabecera (void){ /*función cabecera que usaré simplemente como guía de que primero va el nombre, luego el apellido, etc*/
ofstream fich("practica1.txt",ifstream::app); /*app: escribo al final del fichero*/
fich<<" Nombre : Apellidos : Edad : DNI "<<endl;
}
int compruebarangolineas(int lineas){ /*miramos si el número de líneas está entre 0 y 10000*/
if(lineas>=1 && lineas<= 10000)
return 1;
else
return 0;
}
void nombre(void){ /*generamos un nombre aleatoriamente*/
char k; /*carácter*/
int i;
string nombre=""; /*cadena*/
ofstream fich("practica1.txt",ifstream::app);
for(i=0;i<12;i++){ /*nombre de 12 caracteres*/
k= rand() % 25 + 'a';
nombre=nombre+k;
}
fich<<nombre; /*metemos la cadena nombre en el fichero*/
fich<<":"; /*para separar*/
}
void apellidos(void){
char k;
int i;
string apellidos="";
ofstream fich("practica1.txt",ifstream::app);
for(i=0;i<20;i++){
k= rand() % 25 + 'a';
apellidos=apellidos+k;
}
fich<<apellidos;
fich<<":";
}
void edad(void){
ofstream fich("practica1.txt",ifstream::app);
int edad;
edad=(rand() % 121); /*entre 0 y 120*/
fich<<edad;
fich<<":";
}
//INTENTANDO HACER LA OPCION 1 DEL MENU DEBI TOCAR ALGO, QUE AHORA NO SE ME GENERAN LOS DNIS
int CompruebaDni(int dni, vector<int> v){ /*los dnis irán guardados en un vector*/
int t;
for(t=0;t<=v.size();t++){
if(v[t]=dni)
return 0; /* si alguna componente del vector coincide con el dni que le paso como parametro devuelvo 0*/
}
return 1;
}
void dni(int i){
int t,indicador;
vector <int> v(1);
ofstream fich("practica1.txt",ifstream::app);
t=(rand() % 10001); /*generamos un dni nuevo*/
indicador = CompruebaDni(t,v); /*comprobamos que no esté repe con los almacenados en el vector*/
if(indicador==1){ /*no está repe*/
fich<<t;
fich<<endl;
v[i]=t;
v.resize(v.size()+1);
} /*aumenta el tamaño de v en 1*/
/* si no generamos uno nuevo */
else {dni(i)}; /*y volvemos a comprobar generando un nuevo dni número i*/
}
void EscribirFichero(int lineas){
int i,j = 0;
for(i=0;i<=lineas-1;i++){ /*escribiremos lineas-veces el nombre, apellidos, edad y dni*/
nombre();
apellidos();
edad();
dni(j);
j++;
}
}
//Crear menu y funciones 1 y 2 del menu
int main (int argn, char **argv){
int lineas;
if (argn ==2){
lineas = atoi(argv[1]);
int comprobacion = compruebarangolineas(lineas);
if (comprobacion == 0) printf ("Error. Introduzca un numero de lineas entre 1 y 10000" );
cabecera();
string cadena;
EscribirFichero(lineas);
int vis;
cout << "Introduzca 1 si quiere visualizar el contenido del fichero." <<endl;
cout << "Si no, presione cualquier tecla:" << endl;;
cin >> vis;
if (vis == 1){
ifstream f("practica1.txt");
while(!f.eof()) {
getline(f,cadena);
cout << cadena << endl;
}
f.close();
}
else {
// función menu
}
}
system("PAUSE");
return 0;
}
Espero que me podáis ayudar, en esencia me quedan generar los dnis y las opciones del menú.
Muchas gracias por todo y saludos.
