格式化从txt文件读取数据

时间:2013-07-01 20:02:22

标签: c format

此程序的目的是读取文件并将其格式化为每行62个字符。这个程序编译并部分工作,大多数行是62个字符或更少,但有些行实际上是64个字符。

我想知道如何让所有线条打印出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);

}
}

输出: 四年前和七年前我们的父亲带来了58个字符 在这个大陆上,一个在自由中受孕的新国家 致力于人人生而平等的主张。现在// 64个字符 我们正在进行一场伟大的内战,测试是否存在 国家,或任何国家,如此构想,如此奉献,可以长久 忍受。我们在这场战争的伟大战场上相遇。 我们已经把它的一部分用作最后的休息 那些在这里为那个国家献出生命的人的地方 可能活着。我们应该完全合适和恰当 做这个。但从更广泛的意义上说,我们不能奉献 - 我们可以 没有奉献 - 我们不能使这个理由成为现实。勇敢的人, 在这里挣扎的生者和死者,已经将它奉献给了它 高于我们增加或减少的力量。世界将很少 注意,也不记得,我们在这里所说的,但永远不会 忘了他们在这里做了什么。这是为了我们,生活,而不是 因此,献身于他们所拥有的未完成的工作 远,如此高尚。我们宁愿来到这里 致力于摆在我们面前的伟大任务 尊敬的死者,我们更加热爱这一事业 他们在这里给出了最后一个充分的奉献精神 - 我们 在这里高度决心,这些死者不会死亡 虚荣;这个国家将重新诞生自由;和 这个人民的政府,由人民,为 人民,不应该从地球上灭亡。

1 个答案:

答案 0 :(得分:0)

问题是当您添加 lineLength 变量时。

lineLength += 62;

通过向 lineLength 添加62,您假设在 lbuf 中已经使用了62个字符,但事实并非如此。你通常会用得更少,因为62个字符的单词数量通常最少少于62个字符。因此,所有后续计算都会稍微偏离。

您应该使用以下内容设置新的 lineLength 值:

lineLength  = strlen(lbuf) + 62;

另请注意,这不是一个完美的算法,因为您在检查它是否合适之前在每个单词上添加一个空格。这意味着一个恰好适合62个字符限制的单词最终被包装,因为空格将其推到限制之上。我不知道这对你是否有问题。