C 如何使用fgets()函数使其每行仅读取12个字符?

C 如何使用fgets()函数使其每行仅读取12个字符?,c,function,fgets,C,Function,Fgets,我有一个包含以下文字的文件: Theendsherethiswillnotjaksdjlasdfjkl;asdjfklasdjfkl;asdfjl; these are the 下面是我的代码: int i = 0; bool duplicateFound = false; while(fgets(line,12,fp)){ for (int j = 0; j < i; j++){ if (strcmp(wo

我有一个包含以下文字的文件:

Theendsherethiswillnotjaksdjlasdfjkl;asdjfklasdjfkl;asdfjl;
these
are
the
下面是我的代码:

int i = 0;
    bool duplicateFound = false;
        while(fgets(line,12,fp)){
            for (int j = 0; j < i; j++){
                if (strcmp(wordList[j], line) == 0){
                    duplicateFound = true;
                    printf("Duplicate Found on Line %d : %s\n", j, wordList[j]);
                }
            }
            if (duplicateFound == false){
                strcpy(wordList[i], line);
                printf("%s", wordList[i]);
            }
            i++;*/

            printf("%s", line);
        }
预期产出:

Theendsheret
these
are
the

实际上,您应该只调用fgets,然后执行
行[12]='\0'
,但这并不能完全处理具有长行的输入。一个选项是,如果fgets返回部分行(例如,如果
strchr(行,'\n')
返回NULL),则简单地中止。 如果要处理长行,可以使用getchar丢弃数据,直到看到换行。假设你不想把换行符看成是12个字符中的一个,你可以这样做:

#include <stdio.h>
#include <string.h>

int
main(void)
{
        char line[13];
        while( fgets(line, 13, stdin) ) {
                char *c = strchr(line, '\n');
                int ch;
                if( c == NULL ) while( (ch = getchar()) != EOF ) {
                        if( ch == '\n' ) {
                                break;
                        }
                } else {
                        *c = '\0';
                }
                if( printf("%s\n", line) < 0 ) {
                        break;
                }
        }
        return ferror(stdout) || ferror(stdin) || fclose(stdout) || fclose(stdin);
}
#包括
#包括
int
主(空)
{
字符行[13];
而(fgets(第13行,标准文本)){
char*c=strchr(行“\n”);
int-ch;
if(c==NULL)while((ch=getchar())!=EOF){
如果(ch='\n'){
打破
}
}否则{
*c='\0';
}
如果(printf(“%s\n”,第行)<0){
打破
}
}
返回ferror(stdout)| | ferror(stdin)| | fclose(stdout)| | fclose(stdin);
}

最好发布可编译代码。
fgets(line,sizeof line,fp)有什么问题;第[12]行='\0'
?如果要使用FGET读取多达12个字符,则必须使用13作为缓冲区的长度(请记住,必须在字符串末尾为“\0”留出空间。如果要忽略一行中12个字符之后的字符,则还需要检查缓冲区中是否有“\n”。如果看不到,则需要读取并跳过字符,直到读取该行的结尾或文件的结尾。是否有简单的方法丢弃其他字符第12行?@williampersell会在那之后丢弃字符并移到下一行吗?那么我能保存“行”吗在我的单词列表数组中?你可以对数据做任何你想做的事情。将数据保存到单词列表数组中当然是一种可能性。你仍然需要使用
strcpy
line
在循环的每次迭代中都会被覆盖。
fclose(stdout)| ferror(stdout)| ferror(stdin)
很有趣。当
fclose()
失败,因为“无论调用是否成功,流都与文件断开关联”,以及随后使用
ferror(stdout)
is UB.@NeelPatel您需要更具体地描述所发生的错误。如果您发布完整的代码,将我的答案合并到您的代码中以实现您的目的可能非常简单。在发布完整的代码之前,任何调试代码的尝试都注定会失败。
#include <stdio.h>
#include <string.h>

int
main(void)
{
        char line[13];
        while( fgets(line, 13, stdin) ) {
                char *c = strchr(line, '\n');
                int ch;
                if( c == NULL ) while( (ch = getchar()) != EOF ) {
                        if( ch == '\n' ) {
                                break;
                        }
                } else {
                        *c = '\0';
                }
                if( printf("%s\n", line) < 0 ) {
                        break;
                }
        }
        return ferror(stdout) || ferror(stdin) || fclose(stdout) || fclose(stdin);
}