2013-10-27 45 views
0

目的:程序洗牌文本文件文件輸入到陣列由行字符串

  • 的線讀取文件到一個數組

  • 計數行和最大長度

  • 計算陣列的最大寬度

  • 獲取文件指針

這些是我想要在程序的第一部分中給你一些觀點。我不完全確定「獲取文件指針到底是什麼」。但是,我目前的問題是錯誤閱讀線作爲字符串數組。

已更新代碼seg。當我去打印混洗陣列時出現故障。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 
// Accepts: command line input 
// Returns: 0 if no error 

int main(int argc, char *argv[]){ 
    int x = 0, i, lineCount = 0, maxLen = 0; 
    char line[500], temp; 
    FILE *file = fopen(argv[1], "r"); 
// check if file exists 
    if (file == NULL){ 
     printf("Cannot open file\n"); 
     return 1; 
    } 
// Gets lines, max length of string  
    while (fgets(line, sizeof(line), file) != NULL){ 
     lineCount++; 
     if (strlen(line) > maxLen) 
      maxLen = strlen(line); 
    } 
    rewind(file); 
    char *lineArray[lineCount]; 
    while (fgets(line, sizeof(line), file) != NULL) { 
      lineArray[x] = malloc(strlen(line)); 
     if (lineArray[x] == NULL){ 
      printf("A memory error occurred.\n"); 
      return(1); 
     } 
      strcpy(lineArray[x], line); 
// change \n to \0 
     lineArray[x][strlen(lineArray[x])-1] = '\0'; 
     x++; 
    } 
    printf("File %s has %d lines with maximum length of %d characters\n", 
     argv[1], lineCount, maxLen); 
    printf("Original Array\n"); 
    for (x = 0; x < lineCount; x++) 
     printf("%2d %s\n", x, lineArray[x]); 
// Shuffle array 
    srand((unsigned int) time(NULL)); 
    for (x = lineCount - 1; x >= 0; x--){ 
     i = (int) rand() % lineCount; 
     temp = lineArray[x]; 
     lineArray[x] = lineArray[i]; 
     lineArray[i] = temp; 
    } 
    printf("\nShuffled Array\n"); 
    for (x = 0; x < lineCount; x++) 
     printf("%2d %s\n", x, lineArray[x]); 
// free allocated memory 
    for (x = 0; x < lineCount; x++) 
     free(lineArray[x]); 
    free(lineArray); 
    fclose(file); 
    return 0; 
} 
+0

嘗試'fgets',而不是'fscanf'和'printf'內循環在循環結束之前將會出現segfault('lineArray [x] == NULL') – Kninnug

回答

0

lineArray應被宣佈爲char *,而不是一個指針數組爲char:

char *lineArray[MAX_LINES]; 

另外,考慮當你進入while循環會發生什麼:你的代碼是未定義的行爲,因爲你正在訪問lineArray[x],這是從未初始化,並將包含垃圾值。

您應該使用fgets而不是將整行讀入line,然後將其複製到lineArray。事情是這樣的:

while (fgets(line, sizeof(line), file) != NULL) { 
    lineCount++; 
    lineArray[x] = malloc(strlen(line)); 
    strcpy(lineArray[x], line); 
    printf("%s\n", lineArray[x]); 
    x++; 
} 

從您的帖子,看來你不想侷限於MAX_LINES,和你想先讀取整個文件,以確定數組的大小。要做到這一點,你可以使用類似的循環來先算行數,像這樣:

while (fgets(line, sizeof(line), file) != NULL) { 
    lineCount++; 
} 

這個循環之後,lineCount將舉辦大小lineArray

在這種情況下,你可能要聲明lineArraychar **和動態分配的:

lineArray = malloc(sizeof(char *)*lineCount); 

然後,通過調用rewind(file);回到文件的開頭和執行循環,副本各行成lineArray。總之,你的代碼看起來像這樣:

while (fgets(line, sizeof(line), file) != NULL) { 
    lineCount++; 
} 

lineArray = malloc(sizeof(char *)*lineCount); 

rewind(file); 

while (fgets(line, sizeof(line), file) != NULL) { 
    lineArray[x] = malloc(strlen(line)); 
    strcpy(lineArray[x], line); 
    printf("%s\n", lineArray[x]); 
    x++; 
} 

注1:這是低效的。文件I/O速度非常慢,並且您正在讀取它兩次。考慮這是否真的是你想要做到的。也許一個好方法是強制輸入文件說明它們有多少行。

注2:您應該檢查malloc()的返回值。在這個例子中,我沒有這樣做,但在現實世界中,請做到這一點。注意3:最後,記得free()每個位置lineArray[i],之後,免費lineArray

+0

你知道「Get file pointer to beginning」的意思嗎?非常感謝您的幫助。你給我的是正在工作,但是我在上面的4條項目之後的下一步是「爲動態數組字符串保留內存」。所以,我相信我需要稍後使用malloc。 – WorldDominator

+0

獲取文件指針的開始基本上是調用'倒帶(文件)'。我把這個包括在我的答案中。你需要這樣做,因爲第一次讀取文件後,指針將位於文件的末尾,並且需要將其恢復。並且爲一個動態數組的字符串保留內存非常簡單,如'lineArray = malloc(sizeof(char *)* lineCount);'。在最後一段代碼中,對行進行計數,創建一個動態的字符串數組,將指針復位,並再次讀取文件以將每行復制到新分配的數組中。 –

+0

謝謝先生。我一直盯着這個週末,我終於決定在這裏做一個帳戶,我很高興我做到了! – WorldDominator

0

lineArray這裏只是一個字符指針,它也是未初始化的。它只會指向一個字節。如果它必須保存多行,它必須是一個字符指針數組,因此lineArray[x]lineArray++會將您帶到行數組中的下一行。

+0

小心'lineArray ++' - 如果'lineArray'是一個數組,這不是一個有效的語句;它不能遞增,因爲數組不是可修改的l值。 –

0
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

int main(int argc, char *argv[]){ 
    int x = 0, lineCount = 0, maxlen = 0; 
    char *lineArray[500], line[500]; 

    FILE *file = fopen(argv[1], "r"); 
    if (file == NULL){ 
    printf("Cannot open file\n"); 
    exit(1); 
    } 
    while (x<500 && fgets(line,sizeof(line), file)){ 
     lineArray[x] = strdup(line); 
     if (strlen(line) > maxlen) { 
      maxlen = strlen(line); 
     } 
     x++; 
     lineCount++; 
     printf("%s\n", line); 
    } 
    printf("File %s has %d lines with maximum length of %d characters\n", 
    argv[1], lineCount, maxlen); 
    fclose(file); 
    return 0; 
} 

不明白爲什麼你需要倒帶的文件,如果你想查找此功能,它是fseek(file,0,0)