C中如何逐行打印出一个txt文件?
In C, how to print out a txt file line by line?
int main()
{
FILE *infile;
FILE *infile2;
char input[255],input2[255];
int status1, status2;
infile = fopen("test.txt", "r");
infile2 = fopen("test2.txt", "r");
if(infile == NULL)
{
printf("Can not open file 1!\n");
}
else if(infile2 == NULL)
{
printf("Can not open file 2!\n");
}
else
{
do
{
status1 = fscanf(infile, "%s", &input);
status2 = fscanf(infile2, "%s", &input2);
printf("File 1: %s\n File 2: %s\n", input, input2);
}while(status1 != -1 || status2 != -1);
}
fclose(infile);
fclose(infile2);
return 0;
}
我的输出如下所示:
我想一行打印出文件 1,而不是逐字打印。 file2 也是如此。我对 C 有点陌生,所以我被卡住了。
当您使用 fscanf
时,它只会读取字符,直到出现非白色 space 字符。当您需要将输入作为整行输入时,您必须使用 fgets()
。
来自 fgets()
的 man
页。
fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an
EOF or a newline. If a newline is read, it is stored into the buffer. A terminating null byte ('[=16=]') is stored after the last character
in the buffer.
所以你必须这样使用。
fgets(input,255,infile);
fgets(input2,255,infile2);
在检查条件时,
while(input != NULL || input2 != NULL);
如果您想阅读整行,请使用 fgets
函数而不是 fscanf
:
char *status1, *status2;
.
.
.
do {
status1 = fgets(input, sizeof(input), infile);
status2 = fgets(input2, sizeof(input2), infile2);
printf("File 1: %s File 2: %s", input, input2);
} while (status1 || status2);
请注意 printf
如何不再使用 \n
。这是因为 fgets
将文件中的 \n
保留在输入字符串中。
在我的学校,我们制作了一个 get_next_line 函数,它在参数中接受一个文件描述符和一个指向字符串的指针。
你可以在这里看看:https://github.com/juschaef/libtowel/search?utf8=%E2%9C%93&q=get+next+line
我对代码进行了更改并且它有效,但另一个问题。如果我想比较文件并将差异写入新文件,如下所示:
- 文件1:我叫克努特
- 文件 2:我叫 KnutAndre
- 文件3:安德烈(这是文件之间的区别)。
我的老师告诉我使用 strcmp 然后将输出输出到一个新文件中,但我不太理解他..有没有人有一些我可以尝试的提示?
到目前为止我的代码是这样的:
int main()
{
FILE *infile;
FILE *infile2;
FILE *outfile3;
char input[255],input2[255];
char status1, status2;
infile = fopen("test.txt", "r");
infile2 = fopen("test2.txt", "r");
if(infile == NULL)
{
printf("Can not open file 1!\n");
}
else if(infile2 == NULL)
{
printf("Can not open file 2!\n");
}
else
{
do
{
status1 = fgets(input, sizeof(input), infile);
status2 = fgets(input2, sizeof(input2), infile2);
if(status1 != 0){
printf("File 1: %s\n\nFile 2: %s\n\n", input, input2);
int result = strcmp(input, input2);
printf("\nResult = %d\n\n", result);
}
}
while(status1 || status2);
}
fclose(infile);
fclose(infile2);
return 0;
}
int main()
{
FILE *infile;
FILE *infile2;
char input[255],input2[255];
int status1, status2;
infile = fopen("test.txt", "r");
infile2 = fopen("test2.txt", "r");
if(infile == NULL)
{
printf("Can not open file 1!\n");
}
else if(infile2 == NULL)
{
printf("Can not open file 2!\n");
}
else
{
do
{
status1 = fscanf(infile, "%s", &input);
status2 = fscanf(infile2, "%s", &input2);
printf("File 1: %s\n File 2: %s\n", input, input2);
}while(status1 != -1 || status2 != -1);
}
fclose(infile);
fclose(infile2);
return 0;
}
我的输出如下所示:
我想一行打印出文件 1,而不是逐字打印。 file2 也是如此。我对 C 有点陌生,所以我被卡住了。
当您使用 fscanf
时,它只会读取字符,直到出现非白色 space 字符。当您需要将输入作为整行输入时,您必须使用 fgets()
。
来自 fgets()
的 man
页。
fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A terminating null byte ('[=16=]') is stored after the last character in the buffer.
所以你必须这样使用。
fgets(input,255,infile);
fgets(input2,255,infile2);
在检查条件时,
while(input != NULL || input2 != NULL);
如果您想阅读整行,请使用 fgets
函数而不是 fscanf
:
char *status1, *status2;
.
.
.
do {
status1 = fgets(input, sizeof(input), infile);
status2 = fgets(input2, sizeof(input2), infile2);
printf("File 1: %s File 2: %s", input, input2);
} while (status1 || status2);
请注意 printf
如何不再使用 \n
。这是因为 fgets
将文件中的 \n
保留在输入字符串中。
在我的学校,我们制作了一个 get_next_line 函数,它在参数中接受一个文件描述符和一个指向字符串的指针。
你可以在这里看看:https://github.com/juschaef/libtowel/search?utf8=%E2%9C%93&q=get+next+line
我对代码进行了更改并且它有效,但另一个问题。如果我想比较文件并将差异写入新文件,如下所示:
- 文件1:我叫克努特
- 文件 2:我叫 KnutAndre
- 文件3:安德烈(这是文件之间的区别)。
我的老师告诉我使用 strcmp 然后将输出输出到一个新文件中,但我不太理解他..有没有人有一些我可以尝试的提示?
到目前为止我的代码是这样的:
int main()
{
FILE *infile;
FILE *infile2;
FILE *outfile3;
char input[255],input2[255];
char status1, status2;
infile = fopen("test.txt", "r");
infile2 = fopen("test2.txt", "r");
if(infile == NULL)
{
printf("Can not open file 1!\n");
}
else if(infile2 == NULL)
{
printf("Can not open file 2!\n");
}
else
{
do
{
status1 = fgets(input, sizeof(input), infile);
status2 = fgets(input2, sizeof(input2), infile2);
if(status1 != 0){
printf("File 1: %s\n\nFile 2: %s\n\n", input, input2);
int result = strcmp(input, input2);
printf("\nResult = %d\n\n", result);
}
}
while(status1 || status2);
}
fclose(infile);
fclose(infile2);
return 0;
}