2013-07-01 81 views
0

讀取的數據這個程序的目的是要讀取的文件,並用每行62個字符格式化。這個程序編譯和部分工作,大多數行是62個字符或更少,但是一些行實際上是64個字符。格式化從txt文件

我想知道我怎麼得到它的打印字符62或以下的所有行?

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

#define _CRT_SECURE_NO_DEPRECATE 

void output(char *wbuf, char *lbuf); 
void readFile(FILE *getty, char *wbuf, char *lbuf); 

FILE *getty; 
static int lineLength = 62; 
int main(void) { 
char wbuf[1000] = {0}, lbuf[1500] = {0}; 

if (fopen_s(&getty,"getty.txt", "r") != 0) 
    printf("Failed to open getty.txt for reading."); 
else { 
    readFile(getty, wbuf, lbuf); 
} 

fclose(getty); 
return 0; 
} 

void readFile(FILE *getty, char *wbuf, char *lbuf) { 
int count = 0; 


while (!feof(getty)) { 
    if (fscanf(getty, "%s", wbuf) > 0) { 
     strcat(wbuf," "); 
     output(wbuf, lbuf); 


    } 
} 
printf("%s\n",lbuf); 
} 

void output(char *wbuf, char *lbuf) { 

int wbufLength=0, lbufLength, i = 0; 


wbufLength = strlen(wbuf); 
lbufLength = strlen(lbuf); 

if ((wbufLength + lbufLength) <= lineLength) { 
    strcat(lbuf,wbuf); 

} 
else { 
    strcat(lbuf,"\n"); 
    lineLength += 62; 
    strcat(lbuf, wbuf); 

} 
} 

輸出: 四個得分87年前,我們的祖先帶來了,即所有的人都創建// 58個字符 在這個大陸,一個新的國家,孕育於自由之中,並 致力於平等的命題。現在// 64個字符 我們正從事一場偉大的內戰,以考驗這個 國家,或者任何一個國家,那麼懷孕,所以專用,可以長期忍受 。我們在這裏遇到了這場戰爭的偉大戰場。 我們來到這裏,奉獻它作爲最後的安息 地方對於那些誰在這裏獻出了生命是這個國家 能夠生存下去的部分。我們應該 這樣做是完全合適和適當的。但從更大的意義上說,我們不能奉獻 - 我們可以不奉獻 - 我們不能使這個場地變得神聖。勇敢的人,在這裏奮鬥的生活和死亡的人,已經把它遠遠地奉獻給我們,遠遠超過我們的不良力量來增加或減少。這個世界將很少有 注意,也不會長久記得,我們在這裏說什麼,但絕不能忘記他們在這裏做了什麼。這是我們活着的人,而到 應該獻身於他們有未完成的工作,從而 遠,如此高尚進行的。在這裏,我們寧願在這裏致力於完成我們面前的偉大任務,即從這些 榮譽的死亡中,我們對 增加了對這項事業的熱愛,他們在這裏給出了最後的全部奉獻 - 我們 在這裏高度地解決這些死者不會在 枉死;這個國家將有一個新的自由誕生;並認爲這個人民的政府,人民,爲了人民,不會從地球上滅亡。

回答

0

問題是,當你addjust的線路長度變量。

lineLength += 62; 

通過添加62到線路長度,你假設你已經使用了62個字符在lbuf,但事實並非如此。通常情況下,使用量會減少,因爲適合62個字符的單詞數通常最終會少於62個字符。因此,所有後續的計算都會稍微偏離。

你應該設置新線路長度值與什麼是這樣的:

lineLength = strlen(lbuf) + 62; 

另外請注意,這不是一個完美的算法,因爲你如果檢查前添加到每個單詞空格適合。這意味着一個恰好符合62個字符限制的單詞最終會被封裝,因爲空間將超過限制。我不知道這對你是否有問題。

+0

感謝您的幫助。 – randomname