写到我在 C 中找到一个空行
Write untill i find an empty line in C
我正在尝试查找一天(星期一、星期二...)的所有数据并将数据写在下面。
我的txt文档是这样写的:
Monday .......
..............
..............
Tuesday.......
..............
..............
Monday........
..............
..............
唯一分隔天数的是一个空行。
我成功地在文件中找到了日期,问题是我需要打印所有数据直到出现空行。
例如,如果我 select 星期一(selectedday="Monday"
),我的输出应该是:
Monday .......
..............
..............
Monday .......
..............
..............
我试过的代码:
int main()
{
char string[100], selectedday[] = "monday"; //for Monday
FILE* openbill;
openbill= fopen("bill.txt", "r");
if (openbill== NULL)
{
printf("Failed to open bill\n");
return NULL;
}
while (fscanf(openbill, "%s", string) == 1)
{
if (strstr(openbill, selectedday) != 0)
{
printf("%s", string);
}
}
}
感谢您的帮助。
您的代码中存在多个问题。
错误:
strstr(char* array1, char* array2)
比较两个字符串 array1
和 array2
.
但是在代码中,您将 openbill
(FILE*
) 与 selectedday
(char*
) 进行比较,这将导致错误。
您想在到达空行(string=="\n"
)时停止阅读信息。
但是fscanf()
不将换行符作为输入,因此跳过任何空的换行符。 read here.
只要达到 space
或 newline
,fscanf
就会停止输入。这意味着它只能读取一个单词,而不是 string
(可以包含由 space
分隔的多个单词)
您的字符数组 string
最多可以存储 100 个字符。但是一行可能包含更多的字符,这可能会导致溢出。
可能的解决方案:
strstr(string, selectedday)
而不是 strstr (openbill, selectedday)
.
使用 fgets
而不是 fscanf
。它可以读取换行符,因此可以将空行("\n"
)作为输入。它还通过限制输入的大小来防止溢出。
代码:
空行("\n"
)的特点是它的长度是1char
,而char
是'\n'
.
#include <stdio.h>
#include <string.h>
int getSize(char* charArray) //returns the actual size of an char* array.
{
int size = 0; //size = number of char before '[=10=]'
while (charArray[size] || charArray[size]!=NULL)
{
size++;
}
return( size );
}
int main(int argc, char *argv[]){
char string[100], selectedday[]="monday";
FILE* openbill;
openbill= fopen("bill.txt", "r");
if (openbill== NULL)
{
printf("Failed to open bill\n");
return NULL;
}
while (fgets(string, 100 ,openbill )!=NULL)//EOF not reached and a line is read
{
if (strstr(string, selectedday) != 0)
{
printf("%s", string);
while (fgets(string, 100, openbill ) && getSize(string)!=1 && string!="\n") //EOF not reached and string is not an empty line.
{
printf("%s", string);
}
printf("\n");
}
}
fclose(openbill);
return 0;
}
示例输入:
..
monday---- -------\n1
d----------------\n2
----------- ---kol
but why?
\n
g
monday -----------\n1
d----------- -----\n2
end
g
示例输出:
monday---- -------\n1
d----------------\n2
----------- ---kol
monday -----------\n1
d----------- -----\n2
扫描集%2[\n]
告诉fscanf
最多扫描两个字符并且只扫描换行符。
格式字符串 "%99s"
告诉 fscanf
将最多 99 个非空白字符扫描到 string
中。这为终止零留出了空间。
output
是一个标志,当找到日期时设置为 1
并在扫描一对换行符时设置为 0
。 1
启用输出并打印 string
。
#include <stdio.h>
#include <string.h>
void showday ( char *selectedday) {
char string[100] = "";
char newline[3] = "";
int result = 0;
int output = 0;
FILE* openbill = NULL;
openbill = fopen ( "bill.txt", "r");
if ( openbill == NULL) {
perror ( "bill.txt");
return;
}
do {
string[0] = 0;//set empty string
if ( 1 == ( result = fscanf ( openbill, "%2[\n]", newline))) {
if ( output) {//enabled
printf ( "%s", newline);
}
if ( '\n' == newline[1]) {//two newlines
output = 0;//disable
}
}
else {
result = fscanf ( openbill, "%99s", string);
if ( strstr ( string, selectedday)) {
output = 1;//enable
}
}
if ( output && string[0]) {//enabled and string not empty
printf ( "%s ", string);
}
} while ( EOF != result);
fclose ( openbill);
}
int main ( void) {
showday ( "monday");
return 0;
}
我正在尝试查找一天(星期一、星期二...)的所有数据并将数据写在下面。 我的txt文档是这样写的:
Monday .......
..............
..............
Tuesday.......
..............
..............
Monday........
..............
..............
唯一分隔天数的是一个空行。
我成功地在文件中找到了日期,问题是我需要打印所有数据直到出现空行。
例如,如果我 select 星期一(selectedday="Monday"
),我的输出应该是:
Monday .......
..............
..............
Monday .......
..............
..............
我试过的代码:
int main()
{
char string[100], selectedday[] = "monday"; //for Monday
FILE* openbill;
openbill= fopen("bill.txt", "r");
if (openbill== NULL)
{
printf("Failed to open bill\n");
return NULL;
}
while (fscanf(openbill, "%s", string) == 1)
{
if (strstr(openbill, selectedday) != 0)
{
printf("%s", string);
}
}
}
感谢您的帮助。
您的代码中存在多个问题。
错误:
strstr(char* array1, char* array2)
比较两个字符串array1
和array2
.
但是在代码中,您将openbill
(FILE*
) 与selectedday
(char*
) 进行比较,这将导致错误。您想在到达空行(
string=="\n"
)时停止阅读信息。
但是fscanf()
不将换行符作为输入,因此跳过任何空的换行符。 read here.
只要达到 fscanf
就会停止输入。这意味着它只能读取一个单词,而不是string
(可以包含由space
分隔的多个单词)您的字符数组
string
最多可以存储 100 个字符。但是一行可能包含更多的字符,这可能会导致溢出。
space
或 newline
,可能的解决方案:
strstr(string, selectedday)
而不是strstr (openbill, selectedday)
.使用
fgets
而不是fscanf
。它可以读取换行符,因此可以将空行("\n"
)作为输入。它还通过限制输入的大小来防止溢出。
代码:
空行("\n"
)的特点是它的长度是1char
,而char
是'\n'
.
#include <stdio.h>
#include <string.h>
int getSize(char* charArray) //returns the actual size of an char* array.
{
int size = 0; //size = number of char before '[=10=]'
while (charArray[size] || charArray[size]!=NULL)
{
size++;
}
return( size );
}
int main(int argc, char *argv[]){
char string[100], selectedday[]="monday";
FILE* openbill;
openbill= fopen("bill.txt", "r");
if (openbill== NULL)
{
printf("Failed to open bill\n");
return NULL;
}
while (fgets(string, 100 ,openbill )!=NULL)//EOF not reached and a line is read
{
if (strstr(string, selectedday) != 0)
{
printf("%s", string);
while (fgets(string, 100, openbill ) && getSize(string)!=1 && string!="\n") //EOF not reached and string is not an empty line.
{
printf("%s", string);
}
printf("\n");
}
}
fclose(openbill);
return 0;
}
示例输入:
..
monday---- -------\n1
d----------------\n2
----------- ---kol
but why?
\n
g
monday -----------\n1
d----------- -----\n2
end
g
示例输出:
monday---- -------\n1
d----------------\n2
----------- ---kol
monday -----------\n1
d----------- -----\n2
扫描集%2[\n]
告诉fscanf
最多扫描两个字符并且只扫描换行符。
格式字符串 "%99s"
告诉 fscanf
将最多 99 个非空白字符扫描到 string
中。这为终止零留出了空间。
output
是一个标志,当找到日期时设置为 1
并在扫描一对换行符时设置为 0
。 1
启用输出并打印 string
。
#include <stdio.h>
#include <string.h>
void showday ( char *selectedday) {
char string[100] = "";
char newline[3] = "";
int result = 0;
int output = 0;
FILE* openbill = NULL;
openbill = fopen ( "bill.txt", "r");
if ( openbill == NULL) {
perror ( "bill.txt");
return;
}
do {
string[0] = 0;//set empty string
if ( 1 == ( result = fscanf ( openbill, "%2[\n]", newline))) {
if ( output) {//enabled
printf ( "%s", newline);
}
if ( '\n' == newline[1]) {//two newlines
output = 0;//disable
}
}
else {
result = fscanf ( openbill, "%99s", string);
if ( strstr ( string, selectedday)) {
output = 1;//enable
}
}
if ( output && string[0]) {//enabled and string not empty
printf ( "%s ", string);
}
} while ( EOF != result);
fclose ( openbill);
}
int main ( void) {
showday ( "monday");
return 0;
}