Écrire les n dernières lignes d’un fichier à un autre

C’est le programme que j’ai écrit qui copie toutes les lignes du fichier 24HrDiskData.dat fichier 24HrDiskData.dat . A partir de maintenant, je copie toutes les lignes d’un fichier à un autre Je souhaite copier les n dernières lignes de diskData.dat vers 24HrDiskData.dat

 #include  #include  #include  #include  using namespace std; int main(int argc, char *argv[]) { FILE *HrData; char tempData[1024]; int flag = 0; ofstream fout; fout.open("24HrDiskData.dat", ios::app); // open file for appending assert (!fout.fail()); if ((HrData = fopen("/home/xvishuk/diskData.dat", "r")) == NULL) { printf("\nFile cannot be opened"); } while (fgets(tempData, 1024, HrData) != NULL) { fout << tempData; // write the data to the file } return 0; } 

Exemple de modèle de données délimitées

 |Sat Mar 26 18:47:57 2016|1|1|182|60.66|3|30|4782|31|68|4|3467750|110|43.1562|64| |Sat Mar 26 19:01:49 2016|1|1|140|46.26|3.03|30|4782|30|68|4|3467764|96|43.1562|64| |Sat Mar 26 19:15:40 2016|1|1|184|61.07|3.01|30|4782|30|68|4|3467777|112|43.1562|64| |Sat Mar 26 19:29:30 2016|1|1|180|59.91|3|30|4782|32|68|4|3467791|98|43.1562|64| |Sat Mar 26 19:43:20 2016|1|1|194|64.61|3|30|4782|32|68|4|3467805|114|43.1562|64| |Sat Mar 26 19:57:17 2016|1|1|170|56.62|3|30|4782|30|68|4|3467818|102|43.1562|64| |Sat Mar 26 20:11:14 2016|1|1|140|46.32|3.02|30|4782|30|68|4|3467832|118|43.1562|64| |Sat Mar 26 20:25:12 2016|1|1|176|58.35|3.02|30|4782|30|68|4|3467846|104|43.1562|64| |Sat Mar 26 20:39:10 2016|1|1|202|66.9|3.02|30|4782|30|68|4|3467859|120|43.1562|64| |Sat Mar 26 20:53:11 2016|1|1|198|65.85|3.01|30|4782|31|68|4|3467873|106|43.1562|64| |Sat Mar 26 21:07:12 2016|1|1|184|60.97|3.02|30|4782|32|68|4|3467887|92|43.1562|64| |Sat Mar 26 21:21:11 2016|1|1|152|50.28|3.02|30|4782|31|68|4|3467901|108|43.1562|64| |Sat Mar 26 21:35:16 2016|1|1|168|55.77|3.01|30|4782|30|68|4|3467915|94|43.1562|64| |Sat Mar 26 21:49:20 2016|1|1|172|57.03|3.02|30|4782|31|68|4|3467928|112|43.1562|64| |Sat Mar 26 22:03:26 2016|1|1|152|50.56|3.01|30|4782|33|68|4|3467942|98|43.1562|64| |Sat Mar 26 22:17:32 2016|1|1|174|57.86|3.01|30|4782|31|68|4|3467956|114|43.1562|64| |Sat Mar 26 22:31:38 2016|1|1|156|51.86|3.01|30|4782|30|68|4|3467970|100|43.1562|64| |Sat Mar 26 22:45:44 2016|1|1|202|66.57|3.03|30|4782|30|68|4|3467984|116|43.1562|64| |Sat Mar 26 22:59:55 2016|1|1|188|62.4|3.01|30|4782|31|68|4|3467998|102|43.1562|64| |Sat Mar 26 23:14:06 2016|1|1|164|53.95|3.04|30|4782|32|68|4|3468012|118|43.1562|64| |Sat Mar 26 23:28:17 2016|1|1|168|55.78|3.01|30|4782|31|68|4|3468026|104|43.1562|64| |Sat Mar 26 23:42:28 2016|1|1|176|58.33|3.02|30|4782|30|68|4|3468040|120|43.1562|64| |Sat Mar 26 23:56:39 2016|1|1|170|55.76|3.05|30|4782|30|68|4|3468053|106|43.1562|64| |Sun Mar 27 00:10:54 2016|1|1|172|56.97|3.02|30|4782|31|68|4|3468067|92|43.1562|64| |Sun Mar 27 00:25:13 2016|1|1|184|61.23|3.01|30|4782|33|68|4|3468081|108|43.1562|64| |Sun Mar 27 00:39:26 2016|1|1|188|62.12|3.03|30|4782|31|68|4|3468096|94|43.1562|64| |Sun Mar 27 00:53:42 2016|1|1|170|56.42|3.01|30|4782|30|68|4|3468110|110|43.1562|64| |Sun Mar 27 01:07:58 2016|1|1|174|57.8|3.01|30|4782|31|68|4|3468124|96|43.1562|64| 

Production attendue

Les 10 derniers enregistrements.

 |Sat Mar 26 22:45:44 2016|1|1|202|66.57|3.03|30|4782|30|68|4|3467984|116|43.1562|64| |Sat Mar 26 22:59:55 2016|1|1|188|62.4|3.01|30|4782|31|68|4|3467998|102|43.1562|64| |Sat Mar 26 23:14:06 2016|1|1|164|53.95|3.04|30|4782|32|68|4|3468012|118|43.1562|64| |Sat Mar 26 23:28:17 2016|1|1|168|55.78|3.01|30|4782|31|68|4|3468026|104|43.1562|64| |Sat Mar 26 23:42:28 2016|1|1|176|58.33|3.02|30|4782|30|68|4|3468040|120|43.1562|64| |Sat Mar 26 23:56:39 2016|1|1|170|55.76|3.05|30|4782|30|68|4|3468053|106|43.1562|64| |Sun Mar 27 00:10:54 2016|1|1|172|56.97|3.02|30|4782|31|68|4|3468067|92|43.1562|64| |Sun Mar 27 00:25:13 2016|1|1|184|61.23|3.01|30|4782|33|68|4|3468081|108|43.1562|64| |Sun Mar 27 00:39:26 2016|1|1|188|62.12|3.03|30|4782|31|68|4|3468096|94|43.1562|64| |Sun Mar 27 00:53:42 2016|1|1|170|56.42|3.01|30|4782|30|68|4|3468110|110|43.1562|64| 

Pour écrire uniquement les n dernières lignes, vous pouvez allouer un tableau de n chaînes et y stocker les lignes lorsque vous les lisez, en conservant uniquement le dernier n lorsque le tableau se remplit, en utilisant l’index modulaire pour éviter les copies inutiles.

Lorsque vous atteignez la fin du fichier, affichez les lignes du tableau.

Evitez également de mélanger C et C ++. Soit utiliser soit , mais utiliser les deux en même temps est sujet aux erreurs et inélégant.

Voici une implémentation simple en C:

 #include  #include  #include  #include  #define N 100 int main(void) { char line[1024]; char *stash[N] = { NULL }; int i, j; FILE *HrData, *fout; if ((fout = fopen("24HrDiskData.dat", "a")) == NULL) { fprintf(stderr, "cannot open 24HrDiskData.dat for appending: %s\n", strerror(errno)); return 1; } if ((HrData = fopen("/home/xvishuk/diskData.dat", "r")) == NULL) { fprintf(stderr, "cannot open input file: %s\n", strerror(errno)); return 1; } for (i = 0; fgets(line, 1024, HrData) != NULL;) { free(stash[i]); stash[i] = strdup(line); i = (i + 1) % N; } fclose(HrData); for (j = i;;) { if (stash[i]) fputs(stash[i], fout); i = (i + 1) % N; if (i == j) break; } fclose(fout); return 0; } 

Deux passes.

Première passe, compte les lignes et stocke leurs positions de fichier.

Deuxième passage, calculez le numéro de ligne à partir duquel vous souhaitez commencer la copie. Recherchez sa position dans le conteneur. Chercher la position du fichier. Commencez à copier.

Edit 1: Exemple de code

 #include  #include  #include  #include  int main(void) { std::ssortingng text_line; std::vector file_positions; std::ifstream input_file("my_file.txt"); file_positions.push_back(input_file.tellg()); while (std::getline(input_file, text_line)) { file_positions.push_back(input_file.tellg()); } // The total lines is file_positions.size(). // Return the last 13 lines const unsigned int total_lines = file_positions.size(); std::streampos seek_position = 0; unsigned int index = 0U; if (total_lines > 13U) { index = total_lines - 13U; } input_file.clear(); input_file.seekg(file_positions[index]); // Copy text lines to output file... return 0; } 

Edit 2 – Méthode plus efficace
Vous pouvez conserver un conteneur de N lignes de texte lorsque vous lisez le fichier.

 #include  //... int main(void) { std::deque text_lines(N); while (std::getline(input_file, text_line)) { if (text_lines.size() == N) { text_lines.pop_front(); } text_lines.push_back(text_line); } // Now copy the text lines from the `std::deque` to the output file. //... return 0; }