该程序的目的是读取文件并将其格式化为每行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个字符
我们正在进行一场内战,测试是否
一个民族,或者一个如此构想,如此奉献的民族,可以长期
忍受。我们在那场战争的伟大战场上相遇。
我们来将其中一部分作为最后的休息
在这里献出生命的那个人的地方
可能活着。我们应该完全合宜
做这个。但是从更大的意义上讲,我们不能奉献-我们可以
不奉献-我们不能圣地。勇敢的人
在这里奋斗的生与死,已将其奉献至今
超越了我们增加或分散注意力的能力。世界将很少
请注意,永远不要记住,我们在这里说的是,但永远不会
忘记他们在这里做了什么。对我们来说,是生活,而不是为了
在这里专注于他们尚未完成的工作,因此
远,所以高尚地进行着。我们宁愿在这里
专注于摆在我们面前的艰巨任务
尊敬的死者,我们对这个原因越来越投入
他们在这里给出了最后的全部奉献-我们
在这里,我坚决认为这些死者不会死于
徒劳的这个国家将重生自由;和
人民的人民统治,
人,不可从地上灭亡。

最佳答案

问题是当您调整lineLength变量时。

lineLength += 62;


通过在lineLength中添加62,您假定lbuf中已经用完了62个字符,但事实并非如此。通常您会用完更少的东西,因为适合62个字符的单词数通常最终会少于62个字符。结果,所有后续计算将略有偏离。

您应该使用以下命令设置新的lineLength值:

lineLength  = strlen(lbuf) + 62;


还要注意,这不是一个完美的算法,因为您要在检查每个单词是否合适之前在每个单词上添加一个空格。这意味着刚好适合62个字符限制的单词最终会被换行,因为空格将其推到了限制之外。我不知道这对您是否有问题。

关于c - 格式化从txt文件读取的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17412701/

10-12 04:06