首先,我是C的新编码。
我试图从用户那里读取一串未知大小,直到给出一个空白行,然后将其保存到文件中,然后读取该文件。
我只是设法做到这一点,直到给出新的一行,我不知道如何寻找空白行。
#include <stdio.h>
#include <stdlib.h>
char *input(FILE* fp, size_t size) {
char *str;
int ch;
size_t len = 0;
str = realloc(NULL, sizeof(char)*size);
if (!str)return str;
while (EOF != (ch = fgetc(fp)) && ch != '\n') {
str[len++] = ch;
if (len == size) {
str = realloc(str, sizeof(char)*(size += 16));
if (!str)return str;
}
}
str[len++] = '\0';
return realloc(str, sizeof(char)*len);
}
int main(int argc, const char * argv[]) {
char *istr;
printf("input string : ");
istr = input(stdin, 10);
//write to file
FILE *fp;
fp = fopen("1.txt", "w+");
fprintf(fp, istr);
fclose(fp);
//read file
char c;
fp = fopen("1.txt", "r");
while ((c = fgetc(fp)) != EOF) {
printf("%c", c);
}
printf("\n");
fclose(fp);
free(istr);
return 0;
}
谢谢!
答案 0 :(得分:2)
我会重新调整你的代码。我会将您的input()
函数更改为读取单行的函数(readline()
?)。在main()
中,我会通过readline()
逐行循环阅读。
如果该行为空(只有一个换行符 - 使用strcmp(istr, "\n")
),则释放指针,然后退出循环。否则将该行写入文件并释放指针。
如果您的空行概念包含" \n"
(前缀空格),则编写一个函数is_only_spaces()
,该函数返回一个类似于该字符串的真值。
虽然你可以处理input()
中的空行,但是从输入终止条件中提取行读数是有价值的。
答案 1 :(得分:1)
为什么不使用旗帜或柜台。对于计数器,您可以简单地增加每个字符找到的计数器。如果找到新行并且计数器为0,则它必须是空行。如果找到一个换行符并且计数器不为0,则它必须是该行的结尾,因此将计数器重置为0并继续。
这样的事情:
int count = 0;
while ((ch = fgetc(fp)) != EOF)
{
if(ch == '\n')
{
if(count == 0)
{
break;
}
count = 0;
str[len++] = ch;
}
else
{
str[len++] = ch;
ch++;
}
}
另一种方法是简单地检查字符串中的最后一个字符是否是新行。
while ((ch = fgetc(fp)) != EOF)
{
if(ch == '\n' && str[len - 1] == '\n')
{
break;
}
}
答案 2 :(得分:1)
空白行是仅包含换行符的行,对吗?所以你可以简单地保留你读的最后2个字符。如果它们是'\n'
,那么您检测到一个空行:第一个'\n'
是前一行的结尾,第二个是当前行的结尾(这是一个空行)。
char *input(FILE* fp, size_t size) {
char *str;
int ch, prev_ch;
size_t len = 0;
str = realloc(NULL, sizeof(char)*size);
if (!str)return str;
while (EOF != (ch = fgetc(fp)) && (ch != '\n' && prev_ch != '\n')) {
str[len++] = ch;
if (len == size) {
str = realloc(str, sizeof(char)*(size += 16));
if (!str)return str;
}
prev_ch = ch;
}
str[len++] = '\0';
return realloc(str, sizeof(char)*len);
}
请注意ch != '\n' && prev_ch != '\n'
周围的括号是为了使条件更容易理解。
为了改善这一点,你可以保持你的函数只读取一行并测试返回的行是否为空(它只包含'\n'
)。