代码之家  ›  专栏  ›  技术社区  ›  keser

从文件中删除最后一个\n

c
  •  1
  • keser  · 技术社区  · 7 年前

    .csv 并将输出保存为.txt文件。问题是,我有这个额外的 \n .txt 之后归档。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "input3.h"
    
    
    int main(int argc, char **argv) {
        if (argc < 3) {
            printf("Aufruf: %s <anzahl> <bundesland>\n", argv[0]);
            printf("Beispiel: %s 100 Bayern\n", argv[0]);
            printf("Klein-/Großschreibung beachten!\n");
            exit(1);
        }
        int anzahl = atoi(argv[1]);
        char *bundesland = argv[2];
        char staedte[MAX_LAENGE_ARR][MAX_LAENGE_STR];
        char laender[MAX_LAENGE_ARR][MAX_LAENGE_STR];
        int bewohner[MAX_LAENGE_ARR];
        int len = read_file("staedte.csv", staedte, laender, bewohner);
        int offset = 0;
    
         char *a = (char*) malloc(MAX_LAENGE_ARR * sizeof(char));
    
        for (int i = 0; i < MAX_LAENGE_ARR; ++i) {
    
            if(strcmp(bundesland,laender[i]) == 0 && bewohner[i] >= anzahl){
    
                int written = snprintf(a + offset, MAX_LAENGE_STR ,"Die Stadt %s hat %d Einwohner. \n", staedte[i], bewohner[i]);
                offset += written;
    
            }
        }
    
        printf("STAEDTE : %s \n", a);
        write_file(&a,1);
        free(a);
    }
    

    输出: cat results.txt

    Die Stadt München hat 1353186 Einwohner. 
     Die Stadt Nürnberg hat 505664 Einwohner. 
     Die Stadt Augsburg hat 264708 Einwohner. 
     Die Stadt Regensburg hat 135520 Einwohner. 
     Die Stadt Würzburg hat 133799 Einwohner. 
     Die Stadt Ingolstadt hat 125088 Einwohner. 
     Die Stadt Fürth hat 114628 Einwohner. 
     Die Stadt Erlangen hat 105629 Einwohner.
     // a blank line at the end. 
    

    我不允许更改write\ u file函数,但它在这里。

    void write_file(char *result[], int len) {
        FILE *fp = fopen("resultat.txt", "w");
        if (fp == NULL){
            perror("resultat.txt");
            exit(1);
        }
        for (int i=0; i<len; i++) {
            fprintf(fp, "%s\n", result[i]);
        }
        fclose(fp);
    }
    

    编辑1

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "input3.h"
    
    
    int main(int argc, char **argv) {
        if (argc < 3) {
            printf("Aufruf: %s <anzahl> <bundesland>\n", argv[0]);
            printf("Beispiel: %s 100 Bayern\n", argv[0]);
            printf("Klein-/Großschreibung beachten!\n");
            exit(1);
        }
        int anzahl = atoi(argv[1]);
        char *bundesland = argv[2];
        char staedte[MAX_LAENGE_ARR][MAX_LAENGE_STR];
        char laender[MAX_LAENGE_ARR][MAX_LAENGE_STR];
        int bewohner[MAX_LAENGE_ARR];
        int len = read_file("staedte.csv", staedte, laender, bewohner);
        int count = 0;
    
        char **a = malloc(MAX_LAENGE_ARR * sizeof(char*));
    
        for (int i = 0; i < MAX_LAENGE_ARR; ++i) {
    
            if(strcmp(bundesland,laender[i]) == 0 && bewohner[i] >= anzahl){
                a[i] = malloc(MAX_LAENGE_STR * sizeof(char));
                snprintf(a[i], MAX_LAENGE_STR ,"Die Stadt %s hat %d Einwohner.", staedte[i], bewohner[i]);
                count++;
            }
        }
        write_file(a, count);
        free(a);
    }
    

    (null)
    (null)
    Die Stadt München hat 1353186 Einwohner.
    (null)
    (null)
    (null)
    (null)
    (null)
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Sander De Dycker    7 年前

    你的 write_file 函数已添加 '\n' :

    fprintf(fp, "%s\n", result[i]);
    

    也就是说,代替建筑 a 作为所有行串联的单个字符串,将其构建为字符串数组,数组中的每一行都有一个项(不带 ).

    要做到这一点,你需要 allocate memory for this array snprintf 使用写入该数组中的下一项而不是写入的项进行调用 a + OFFSET :

    char **a = malloc(MAX_LAENGE_ARR * sizeof(char*));
    

    然后对于每一行:

    a[count] = malloc(MAX_LAENGE_STR * sizeof(char));
    snprintf(a[count], MAX_LAENGE_STR, ...);
    

    别忘了 free the allocated memory

        2
  •  0
  •   Jabberwocky    7 年前

    你基本上想要这个:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "input3.h"
    
    ...
    
    int main(int argc, char **argv) {
      if (argc < 3) {
        printf("Aufruf: %s <anzahl> <bundesland>\n", argv[0]);
        printf("Beispiel: %s 100 Bayern\n", argv[0]);
        printf("Klein-/Großschreibung beachten!\n");
        exit(1);
      }
      int anzahl = atoi(argv[1]);
      char *bundesland = argv[2];
      char staedte[MAX_LAENGE_ARR][MAX_LAENGE_STR];
      char laender[MAX_LAENGE_ARR][MAX_LAENGE_STR];
      int bewohner[MAX_LAENGE_ARR];
      int len = read_file("staedte.csv", staedte, laender, bewohner);
    
      // allocate an array of pointers to char of length MAX_LAENGE_ARR
      char **lines = malloc(MAX_LAENGE_ARR * sizeof(*lines));
    
      // instead of the line above you could simply write this
      //    char *lines[MAX_LAENGE_ARR];
      // in that case you need to remove the `free(lines);` at the end
    
      int nboflines = 0; // number of lines processed
    
      for (int i = 0; i < MAX_LAENGE_ARR; ++i) {
    
        if (strcmp(bundesland, laender[i]) == 0 && bewohner[i] >= anzahl) {
          // get the size needed for one line (see snprintf documentation for more details)
          int sizeneeded = snprintf(NULL, MAX_LAENGE_STR, "Die Stadt %s hat %d Einwohner. \n", staedte[i], bewohner[i]);
    
          // allocate the size needed for the line +1 for the NUL terminator
          char *line = malloc(sizeneeded + 1);
    
          // output to line
          snprintf(line, MAX_LAENGE_STR, "Die Stadt %s hat %d Einwohner. \n", staedte[i], bewohner[i]);    
    
          lines[nboflines++] = line;
        }
      }
    
    
      printf("STAEDTE :");
      for (int i = 0; i < nboflines; ++i)
      {
        printf("%s\n", lines[i]);
      }
    
      write_file(lines, nboflines);
    
      // free the individual lines allocated by the malloc
      //  inside the for loop
      for (int i = 0; i < nboflines; ++i)
      {
        free(lines[i]);
      }
    
      // free the line array allocated just before the for loop
      free(lines);
    }
    
    • 请参阅我添加的注释以获取解释。
    • a 更具意义的名字 lines .

    • 此代码尚未测试。
    • 仍有进一步改进的余地。