我的程序需要从文本文件中获取输入并将其输出到单行。
但是,如果单数行上的字符数超过60,则应该有一个新行。
到目前为止我的代码:
int main(int argc, char *argv[]){
FILE *pFile;
char x[10];
char *token;
pFile = fopen("test5.txt","r");
int wordLength;
int totalCharLength;
char newline[10] = "newline";
if(pFile != NULL){
while (fgets(x, sizeof(x), pFile) != NULL) {
token = strtok(x,"\r\n");
if(token != NULL){
printf("%s",x);
}
else{
printf("%s",x);
}
//counter++;
wordLength = strlen(x);
totalCharLength += wordLength;
printf("%d",totalCharLength);
if(totalCharLength == 60){
printf("%s",newline);
}
}
fclose(pFile);
}
}
TEXTFILE:
a dog chased
a cat up the
tree. The cat
looked at the dog from
the top of the tree.
有5个单独的行。哪个显示了这个。这不是全部。
输出:
a dog chased a cat up the tree. The cat looked at the dog from the top of the tree.
现在程序需要能够以该格式获取输入文本并打印出来。
所以上面的输出应该在第60个字符处有一个新行,它在第二个单词“dog”之前。
但是我想添加一个功能,以便有一个字符计数器,当字符数= 60时,它会打印一个新行。
现在通过更多调试我添加了代码
printf("%d",totalCharLength);
就在if(totalCharLength == 60)行之前,我意识到字符是以随机增量而不是逐个计算的。输出:
a dog cha9sed 13a cat up 22the 26tree. The35 cat 40looked at49 the dog 58 from 63 the top o72f the tre81e. 85
因此,这表明它不会逐个字符计算。但是,当我将charx [10]更改为较低的值时,它不会在一行上打印所有内容。它会留下空白。
示例:将charx [10]更改为charx [2]
这正确地按字符获取字符,但输出不在一行上。
当一行中字符超过60时,唯一应该有新行的时间。不是14(第一行)。
a2 3d4o5g6 7c8h9a10s11e12d13 14
30a17 18c19a20t21 22u23p24 25t26h27e28 29
46t32r33e34e35.36 37T38h39e40 41c42a43t44 45
71l48o49o50k51e52d53 54a55t56 57t58h59e60newline 61d62o63g64 65f66r67o68m69 70
72t73h74e75 76t77o78p79 80o81f82 83t84h85e86 87t88r89e90e91.92 93 94
答案 0 :(得分:1)
我认为你最好自己打印每个字符,并在添加换行符之前检查空格。
类似的东西:
((charCount > 60) && (currentChar == ' ')) {
// print newline and reset counter
printf("\n");
charCount = 0;
}
编辑:
在任何事情之前检查当前的char是否已经是换行符并跳过它。
检查回车\r
,因为在窗口换行符是\r\n
。
#include <stdio.h>
int main(void) {
FILE *f = fopen("test.txt", "r");
if(!f) {
printf("File not found.\n");
return 1;
}
char c;
int cCount = 0;
while((c = fgetc(f)) != EOF) {
if(c == '\r') continue;
if(c == '\n') c = ' ';
printf("%c", c);
if((cCount++ > 60) && (c == ' ')) {
printf("\n");
cCount = 0;
}
}
fclose(f);
return 0;
}
答案 1 :(得分:1)
你去了
<html lang="en">
<head>
<!-- The Homebrewery - About
Author: Chris Stastny
Date: October 15th, 2015
-->
<meta charset="utf-8">
<title>The Homebrewery - About Homebrewing</title>
<meta name="description" content="About Homebrewing">
<meta name="author" content="Chris Stastny">
<link href="final.css" rel="stylesheet" type="text/css" />
<script src="modernizr-1.5.js"></script>
<script src="function.js"></script>
</head>
<body>
<header>
<h1>The Homebrewery</h1>
<div id="dateBox">
Today is <br />
<script type="text/javascript">
document.write(showDate());
</script>
<br />
Beer style today <br />
<script type="text/javascript">
document.write(showBeerStyle(dayNumber()));
</script>
</div>
</header>
答案 2 :(得分:0)
if(token != NULL){
printf("%s",x);
strcat(newArray, x);
}
打印出令牌后,还有一个单独的数组,您也可以连接该令牌。这将在一行中为您提供整个文件。从这里解析60个字符然后打印线就会容易得多。
答案 3 :(得分:0)
就是这样,
#include<stdio.h>
//#pragma warning(disable : 4996)
int main()
{
FILE *pfile;
char data;
int count = 1;
pfile = fopen("test.txt", "r");
printf("Opening file...\n");
if (pfile == NULL)
{
printf("Error!\n");
}
while ((data = fgetc(pfile)) != EOF)
{
if (count != 60)
{
if (data != '\n')
{
printf("%c", data);
count++;
}
}
else
{
printf("\n");
count = 1;
}
}
fclose(pfile);
return 0;
}
答案 4 :(得分:0)
在第一种情况下,当您有char x[10]
时,fgets
最多可读取9个字符,或直到找到换行符。所以输出是
a dog cha9sed 13a cat up 22the 26
因为第一次调用fgets
读取9个字符(然后打印9),第二次调用读取到换行符(打印13),第三次调用读取9个字符(打印22),第四次调用呼叫读取到换行符(打印26)。
当您更改为char x[2]
时,fgets
一次只会读取一个字符。这导致strtok
的工作方式与您预期的不同。当字符串仅包含分隔符时,strtok
将返回NULL
并且字符串未经修改。因此,如果字符串仅包含换行符,则strtok
不会像您期望的那样删除换行符。
要修复代码,请使用fgetc
阅读字符,不要使用strtok
。
int main( void )
{
FILE *pFile;
if ( (pFile = fopen("test5.txt","r")) == NULL )
exit( 1 );
int c, count;
count = 0;
while ( (c = fgetc(pFile)) != EOF ) {
if ( c == '\n' )
putchar( ' ' );
else
putchar( c );
count++;
if ( count == 60 ) {
putchar( '\n' );
count = 0;
}
}
putchar( '\n' );
fclose(pFile);
}
这是我用
测试的文件a dog chased
a cat up the
tree. The cat
looked at the dog from
the top of the tree.
答案 5 :(得分:0)
sudo python3 -m pip install requests