我正在尝试读取文件的第一个字符,只要它等于'('
我就应该跳过该行,否则从该行获取第一个字符。我在Mac下,我可以使用fgetln
。
FILE *file = fopen("test.txt", "r");
char c;
while(fscanf(file, "%s", &c) != EOF) {
if (c != '(')
printf("%c", c);
}
这是我目前的代码。我不知道如何跳过行,虽然我试图获得整行并且仅检查解决跳过问题的第一个字符。然而,这不起作用我在我的控制台而不是test.txt
内的字符中得到奇怪的字符。我该怎么做?
答案 0 :(得分:1)
使用%s
fscanf
格式说明符的问题在于空格上的分割,而不仅仅是在行尾字符上。此外,在单字符缓冲区中读取它将几乎总是产生未定义的行为。
使用不同的API有几种方法可以解决这个问题:
%s
替换为%200[^\n]
,并传递201个字符的缓冲区而不是c
,fgets
与正确大小的缓冲区一起使用,然后选择初始字符或'\n'
字符时都会标记:以下是如何实施第三种方法:
bool takeNext = true;
int ch;
while ((ch = fgetc(file)) != EOF) {
if (takeNext && ch != '(') {
printf("%c", ch);
}
takeNext = (ch == '\n');
}
答案 1 :(得分:0)
将c更改为字符串,因为fscanf读取字符串。查看c的第一个字符是否与(
匹配。
如果没有,则打印该行,否则跳过该行。
FILE *file = fopen("test.txt", "r");
char c[100];
while(fscanf(file, "%s", c)) {
if (c[0] != '(')
printf("%s", c);
}
答案 2 :(得分:0)
使用fgets读取整行。它也比fscanf更安全,因为它将读数限制为缓冲区大小。
检查第一个字符是否为'('您可以直接引用它:
if (buf[0]=='(')
或
if (*buf=='(')
答案 3 :(得分:0)
这是一个稍微长一些的基于字符的方法,它决定一行中的第一个字符是否为(
。
如果是(
,那么我们会消耗所有内容,包括下一个换行符而不输出。
如果不是,那么我们会做同样的事情,但是在我们阅读时输出字符。
#include <stdio.h>
int main(){
FILE *file = fopen("test.txt", "r");
int c;
while((c = getc(file)) != -1) {
if (c == '(') {
// Skip until the next newline
do {
c = getc(file);
} while (c != -1 && c != '\n');
continue;
}
else {
putchar(c);
do {
c = getc(file);
putchar(c);
} while (c != -1 && c != '\n');
}
}
fclose(file);
}