从文本文件中一个一个地计算字符
Counting characters one by one from a textfile
我的程序需要从文本文件中获取输入并在 单行中输出。
但是,如果单个行上的字符数超过 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);
}
}
文本文件:
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.
现在程序需要能够获取该格式的输入文本并在一行中打印出来。
所以上面的输出应该在第二个单词 "dog".
之前的第 60 个字符处换行
但是我想添加一个功能,以便有一个字符计数器,当字符数 = 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
我认为您最好单独打印每个字符,并在添加换行符之前检查 space。
类似于:
((charCount > 60) && (currentChar == ' ')) {
// print newline and reset counter
printf("\n");
charCount = 0;
}
编辑:
在任何事情之前检查当前字符是否已经是换行符并跳过它。
检查马车 return \r
因为在 windows 换行符是 \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;
}
if(token != NULL){
printf("%s",x);
strcat(newArray, x);
}
打印出令牌后,有一个单独的数组,您也可以连接令牌。这将使您在一行中看到整个文件。从这里解析出 60 个字符然后打印行会容易得多。
事情是这样的,
#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;
}
在第一种情况下,当您有 char x[10]
时,fgets
将读取最多 9 个字符,或者直到找到换行符。所以输出是
a dog cha9sed 13a cat up 22the 26
因为第一次调用 fgets
读取 9 个字符(然后打印 9),第二次调用读取到换行符(打印 13),第三次调用读取九个字符(打印 22),并且第四个调用读取到换行符(打印 26)。
当您更改为char x[2]
时,fgets
将一次只读取一个字符。这导致 strtok
的工作方式与您预期的不同。当字符串仅包含分隔符时,strtok
将 return 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.
好了
int main() {
FILE *pFile = fopen("test.txt","r");
int c, counter = 0;
if (pFile != NULL) {
while ((c = getc(pFile)) != EOF) {
counter++;
if (c != '\n') { putchar(c); }
if (counter == 60) {
counter = 0;
printf("\n");
}
}
}
fclose(pFile);
}
#include <stdio.h>
#include <ctype.h>
int main(void){//unused argv
FILE *pFile;
int ch, prev = 0;
int totalCharLength = 0;
int wrap_size = 60;
//char newline[] = "newline";
pFile = fopen("test5.txt","r");
if(pFile != NULL){
while((ch = fgetc(pFile)) != EOF){
if(isspace(ch))
ch = ' ';
if(prev == ' ' && ch == ' ')
continue;//unified
prev = ch;
putchar(ch);
if(++totalCharLength == wrap_size -1){//-1 : include newline
putchar('\n');//printf("%s", newline);
totalCharLength = 0;
}
}
fclose(pFile);//put inside if-block
}
return 0;
}
我的程序需要从文本文件中获取输入并在 单行中输出。
但是,如果单个行上的字符数超过 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);
}
}
文本文件:
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.
现在程序需要能够获取该格式的输入文本并在一行中打印出来。
所以上面的输出应该在第二个单词 "dog".
之前的第 60 个字符处换行但是我想添加一个功能,以便有一个字符计数器,当字符数 = 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
我认为您最好单独打印每个字符,并在添加换行符之前检查 space。
类似于:
((charCount > 60) && (currentChar == ' ')) {
// print newline and reset counter
printf("\n");
charCount = 0;
}
编辑:
在任何事情之前检查当前字符是否已经是换行符并跳过它。
检查马车 return \r
因为在 windows 换行符是 \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;
}
if(token != NULL){
printf("%s",x);
strcat(newArray, x);
}
打印出令牌后,有一个单独的数组,您也可以连接令牌。这将使您在一行中看到整个文件。从这里解析出 60 个字符然后打印行会容易得多。
事情是这样的,
#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;
}
在第一种情况下,当您有 char x[10]
时,fgets
将读取最多 9 个字符,或者直到找到换行符。所以输出是
a dog cha9sed 13a cat up 22the 26
因为第一次调用 fgets
读取 9 个字符(然后打印 9),第二次调用读取到换行符(打印 13),第三次调用读取九个字符(打印 22),并且第四个调用读取到换行符(打印 26)。
当您更改为char x[2]
时,fgets
将一次只读取一个字符。这导致 strtok
的工作方式与您预期的不同。当字符串仅包含分隔符时,strtok
将 return 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.
好了
int main() {
FILE *pFile = fopen("test.txt","r");
int c, counter = 0;
if (pFile != NULL) {
while ((c = getc(pFile)) != EOF) {
counter++;
if (c != '\n') { putchar(c); }
if (counter == 60) {
counter = 0;
printf("\n");
}
}
}
fclose(pFile);
}
#include <stdio.h>
#include <ctype.h>
int main(void){//unused argv
FILE *pFile;
int ch, prev = 0;
int totalCharLength = 0;
int wrap_size = 60;
//char newline[] = "newline";
pFile = fopen("test5.txt","r");
if(pFile != NULL){
while((ch = fgetc(pFile)) != EOF){
if(isspace(ch))
ch = ' ';
if(prev == ' ' && ch == ' ')
continue;//unified
prev = ch;
putchar(ch);
if(++totalCharLength == wrap_size -1){//-1 : include newline
putchar('\n');//printf("%s", newline);
totalCharLength = 0;
}
}
fclose(pFile);//put inside if-block
}
return 0;
}