0

私は、ファイルから行を読み取り、qsort を使用して並べ替えるクラス用の小さな C プログラムに取り組んでいます。簡単に言うと、ファイルのすべての行にメモリを動的に割り当ててchar*、 の配列にとして保存していますchar*。読み取りと保存は、出力に基づいて表面上は正常に機能しますが (以下を参照)、行を印刷すると、それらはすべてファイルの最後の行の複製になります。誰かが私の(おそらく痛いほど明らかな)エラーを指摘できますか?

私が現在実行している問題に関連するコードは次のとおりです。

char* trim_white_space(char* str);
char* get_line(FILE* infile, char temp[]);

int main(int argc, char* argv[]) {
    FILE* infile; 
    char* input_file = argv[1];
    int cnt = 0;
    char temp[MAX_LINE_LENGTH]; //to hold each line as it gets read in 
    char* tempPointer = temp;

    if (argc < 2) {
        printf("No input file provided");
        return EXIT_FAILURE;
    }

    //determine the number of lines in the file
    infile = fopen(input_file, "r");
    int num_lines_in_file = num_lines(infile);
    fclose(infile);

    //allocate pointers for each line
    char** lines = (char**) malloc(num_lines_in_file * sizeof(char*));

    //temporarily store each line, and then dynamically allocate exact memory for them
    infile = fopen(input_file, "r");
    for (cnt = 0; cnt != num_lines_in_file; cnt++) {
        tempPointer = get_line(infile, temp);  
        lines[cnt] = (char*) malloc(strlen(tempPointer) + 1);
        lines[cnt] = trim_white_space(tempPointer);
        printf("%d: %s\n", cnt, lines[cnt]);
    }

    fclose(infile);

    //print the unsorted lines (for debugging purposes)
    printf("Unsorted list:\n");
    for (cnt = 0; cnt != num_lines_in_file; cnt++) {
        printf("%s\n", lines[cnt]);
    }

char* get_line(FILE* infile, char temp[]) {
    fgets(temp, MAX_LINE_LENGTH-1, infile);
    char* pntr = temp;
    return pntr;
}

char *trimwhitespace(char *str)
{
  char *end;

  // Trim leading space
  while(isspace(*str)) str++;

  if(*str == 0)  // All spaces?
    return str;

  // Trim trailing space
  end = str + strlen(str) - 1;
  while(end > str && isspace(*end)) end--;

  // Write new null terminator
  *(end+1) = 0;

  return str;
}

このサンプル入力ファイルがあります5-1input.dat

Hi guys
x2 My name is
Slim Shady
For real

そして、ここに私が得ている出力があります:

user@user-VirtualBox ~/Desktop/Low-level/HW5 $ ./homework5-1 5-1input.dat 
0: Hi guys
1: x2 My name is
2: Slim Shady
3: For real
Unsorted list:
For real
For real
For real
For real
4

1 に答える 1

1

コメントのように、ループを次のように変更する必要があります。

for (cnt = 0; cnt != num_lines_in_file; cnt++) {
    tempPointer = get_line(infile, temp);  
    lines[cnt] = (char*) malloc(strlen(tempPointer) + 1);
    strncpy(lines[cnt], trim_white_space(tempPointer), strlen(tempPointer)+1);
    printf("%d: %s\n", cnt, lines[cnt]);
}

のサイズは、使用strncpyしたサイズに基づいていmallocます。

もちろん、strlen を 1 回だけカウントするなど、このコードを最適化することもできます。

于 2013-08-17T22:52:10.037 に答える