我试图逐字阅读,下面是我采用的逻辑。这是正确的读取,除非它到达一行中的最后一个单词,其中它存储当前文件的最后一个单词和下一个新行的第一个单词。有人可以告诉我如何才能让它发挥作用吗?
int c;
int i =0;
char line[1000]
do{
c = fgetc(fp);
if( c != ' '){
printf("%c", c);
line[i++] = c;
}else if((c == '\n')){
//this is where It should do nothing
}else{
line[i] = '\0';
printf("\\0 reached\n");//meaning end of one word has been reached
strcpy(wordArr[counter++].word, line);//copy that word that's in line[xxx] to the struct's .word Char array
i=0;//reset the line's counter
}//if loop end
} while(c != EOF);//do-while end
fp
是一个文件指针。
HI BABY TYPE MAYBE
TODAY HELLO CAR
HELLO ZEBRA LION DON
TYPE BABY
我得到(没有引号)
"HI"
"BABY"
"TYPE"
"MAYBE
TODAY"
答案 0 :(得分:3)
看看这个:
if(c != ' ') {
// ...
} else if(c == '\n') {
// WILL NEVER BE REACHED
}
如果c == '\n'
,则c != ' '
也为真,这意味着将跳过第二个块,并且第一个块将针对所有'\n'
个字符运行,(即将打印出来)。
关于行结尾的其他答案是错误的。未以二进制模式打开的C FILE *
将为您处理EOL。如果你有一个来自DOS的文件并且你在Unix上阅读它可能会产生问题,但我怀疑这是你的问题,如果它正在处理它可能比这里显示的答案稍微复杂一点。但是当你到达那座桥时,你可以越过那座桥。
答案 1 :(得分:1)
行终止字符的编码因操作系统而异。在Linux中,它只是'\ n',而在Windows和DOS中它是'\ r \ n'。因此,根据您的目标操作系统,您可能需要更改语句,如:
if((c == '\r' || (c == '\n'))
{
//...
}
编辑:仔细观察后,我认为你做错了就是第一个 if 语句是真的,即使你读了\ n,所以你应该这样处理:
if((c != ' ') && (c != '\n')){
printf("%c", c);
line[i++] = c;
}
else if((c == '\n') || (c == '\r')){
//this is where It should do nothing
}
else{
//...
}
答案 2 :(得分:0)
试试这个;
if((c == '\n') || (c == '\r'){
答案 3 :(得分:0)
这对我有用(在Linux上):
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char **argv)
{
char c;
size_t i = 0;
FILE *file = NULL;
char buffer[BUFSIZ];
int status = EXIT_SUCCESS;
if (argc < 2) {
fprintf(stderr, "%s <FILE>\n", argv[0]);
goto error;
}
file = fopen(argv[1], "r");
if (!file) {
fprintf(stderr, "%s: %s: %s\n", argv[0], argv[1],
strerror(errno));
goto error;
}
while (EOF != (c = fgetc(file))) {
if (BUFSIZ == i) {
fprintf(stderr, "%s: D'oh! Write a program that "
"doesn't use static buffers\n",
argv[0]);
goto error;
}
if (' ' == c || '\n' == c) {
buffer[i++] = '\0';
fprintf(stdout, "%s\n", buffer);
i = 0;
} else if ('\r' == c) {
/* ignore */
} else {
buffer[i++] = c;
}
}
exit:
if (file) {
fclose(file);
}
return status;
error:
status = EXIT_FAILURE;
goto exit;
}
答案 4 :(得分:0)
变化
if( c != ' ')
至
if( c != ' '&&c!='\n')
这应解决问题