2013-10-19 100 views
-1

我正在學習C並決定將我的遊戲人生代碼從Java移植過來。除了FileIO部分外,這似乎並不困難。我的輸入文件如下所示:康威的人生遊戲FileIO

Beehive 
5 6 

------ 
--XX-- 
-X--X- 
--XX-- 
------ 

下面是我在Java中做了什麼的pseduo代碼;

Scanner to open the file, 
String line = file.nextLine(), 
print the line, 
get the second line 
Trim and split the firstLine, 
String[tokens[0]][tokens[1]], 

while(line != NULL) -> string[row][col] = input.charAt(i); 
close input, 
return string[][] 

這是我在C到目前爲止,

void fileIO() { 
    FILE *file; 
    char buffer[BUFFER_SIZE]; 

    file = fopen("INPUT_FILE", "r"); 

    if(file == NULL) { 
      printf("Cannot open file!"); 
    } 

    while(fgets(buffer, BUFFER_SIZE, file) != NULL) { 

    } 
} 

我不知道應該怎麼進行呢?任何人都可以給我一個指向哪裏從這裏走?

+0

嗯,我想'fgets'就像'String line = file.nextLine()'現在'buffer'是你的'line',所以,我猜根據你的僞代碼,你想打印它? – Leonardo

回答

1

要打印線puts

puts(buffer); 

注意fgets後,buffer包含換行符\n,這也會被顯示出來。我想你想要這種行爲(不知道這是如何工作在Java中)。


要修剪和分割線sscanf

int height, width; 
... 
sscanf(buffer, "%d%d", &height, &width); 

爲了提取從字符串(而不是input.charAt(i))一個字符:

char c = buffer[i]; 

這不是文件I/O;它只是從字符串中獲取字符的C語法。


看起來你有一個Java函數返回一個二維數組(字符串?),它是動態分配的。 Java支持在數組對象本身中記錄寬度和高度,而C不支持這個。代替2- d陣列的,你將不得不使用struct

struct MyDataFromFile 
{ 
    int height, width; 
    bool **data; 
}; 

這樣的數據結構僅是一種可能的選擇;你可以使用不同的選項:

  • bool[MAX_HEIGHT][MAX_WIDTH] - 方便,如果有最大高度和寬度
  • uint64_t *data如果你想使用1位存儲,而不是1個字節的 - 這需要額外的比特擺弄