Tag: fgets

为什么断言失败?

当我尝试使用VC2010调试它时,此代码失败: char frd[32]=”word-list.txt”; FILE *rd=fopen(frd,”r”); if(rd==NULL) { std::cout<<"Coudn't open file\t"<<frd; exit(1); } char readLine[100]; while(fgets(readLine, 100, rd) != NULL) { readLine[strlen(readLine) – 1] = '\0'; char *token = NULL; token = strtok(readLine, " ,"); insert(readLine); } 调试结果 ————————— Microsoft Visual C ++调试库———– 调试断言失败! 程序:… \ documents \ visual studio 2010 \ Projects \ bfa \ […]

fgets()在fscanf()之后无法正常工作

我使用fscanf读取日期然后fgets读取笔记。 但是在第一次迭代之后,fscanf返回值-1。 我使用GDB逐步调试程序。 它在第一次使用fgets之前工作正常。 当我尝试在第一次迭代时打印出由fgets读取的行时,它给了我: (gdb) print line $6 = “\rtest\r18/04/2010\rtest2\r03/05/2010\rtest3\r05/08/2009\rtest4\r\n\000\000\000\000q\352\261\a\370\366\377\267.N=\366\000\000\000\000\003\000\000\000\370xC\000\000\000\000\000\000\000\000\000\001\000\000\000\227\b\000\000\070\367\377\267H\364\377\267\362\202\004\bdoD\000\354\201\004\b\001\000\000\000\304oC\000p\363\377\277\260zC\000D\363\377\277\n!B\000\064\363\377\277\354\201\004\b(\363\377\277TzC\000\000\000\000\000\070\367\377\267\001\000\000\000\000\000\000\000\001\000\000\000\370xC\000\001\000\000\000\000\000\312\000\000\000\000\000\377\260\360\000\001\000\000\000\277\000\000\000\364\317\000\000\344\261\\\000\000\000\000\000p\363\377\277|\233\004\b\350\362\377\277 \204\004\b\005\000\000\000|\233\004\b\030\363\377\277” 它看起来像fgets读取剩余的条目,然后将它们全部存储在一个字符串中。 我不确定为什么会这样做。 这是主要代码: int main(int argc, char* argv[]) { FILE* file; int numEntries, i = 0; int index = atoi(argv[1]); char line[SIZE]; JournalEntry *entry; /*argument provided is the entry user wants to be displayed*/ if (argc > 2) { perror(“Error: Too many arguments […]

如何在C中逐行读取文件?

我有一个文本文件,最多100个IP地址,每行1个。 我需要将每个地址作为字符串读入名为“list”的数组中。 首先,我假设“list”需要是一个二维char数组。 每个IP地址长度为11个字符,如果包含“\ 0”,则为12个,因此我声明列表如下: char list[100][12]; 接下来,我尝试使用fgets来读取流: for (i = 0; i < 100; i++) { if (feof(stream)) break; for (j = 0; j < 12; j++) fgets(&list[i][j], 12, stream); count++; } 要检查字符串是否已正确读取,我尝试输出它们: for (i = 0; i < 5; i++) { for (j = 0; j < 11; j++) printf("%c", list[i][j]); printf("\n"); } […]

从stdin,C读取未知数量的行

我有一个读取未知大小的标准输入的问题。 实际上它是.txt文件中的一个表,我通过调用参数'<'table.txt来获取stdin。 我的代码应如下所示: #include #include int main(int argc,char *argv[]) { char words[10][1024]; int i=0; while(feof(stdin)==0) { fgets(words[i],100,stdin); printf(“%s”, words[i]); i++; } return 0; } 但有问题我不知道行的nuber,在这种情况下是10(我们知道行中的字符数 – 1024)。 如果有人知道解决方案会很棒。 提前致谢。

fgets跳过空白行

我正在编写一个C程序,它使用fgets从文件中读取每一行。 问题是,如果文件有一个空行,如何跳过它以获得下一行? 这是我到目前为止所尝试的但是没有用。 char line[100]; FILE *filePtr = fopen(filename, “r”); while(fgets(line, sizeof(line), filePtr) != NULL) //read each line of the file { if (line != “\n”) { //do something } else { continue; } }

使用fgets()和strtok()在C中逐行读取文件?

我正在尝试使用fgets和strtok()逐行读取文件,并创建每个不同信息行的链接列表。 现在,我只是将信息放入一个数组,只是为了试图弄清楚如何正确读取信息,但它不能正常工作。 在while(fgets)部分,它似乎正确地将所有内容加载到数组中,并将其打印出来。 然而,在循环执行之后我尝试打印整个数组,我得到了非常奇怪的结果..这主要是最后一行的部分,而不是大部分的完整单词或任何东西。 例如,如果我正在读书: Simpson, Homer, Male, 1976 Simpson, Marge, Female, 1978 Simpson, Bart, Male, 2002 Simpson, Lisa, Female, 2004 Simpson, Maggie, Female, 2011 我最后得到的打印输出是这样的: le Simpson Maggie Simpson Maggie e ale Simpson Maggie e e Simpson Maggie Female 2011 请让我知道我哪里出错了,谢谢! #include #include #include #define MAXSTRINGSIZE 10 #define LINESIZE 128 struct person{ char firstName[MAXSTRINGSIZE]; […]

由fgets回车

我正在运行以下代码: #include #include #include int main(){ FILE *fp; if((fp=fopen(“test.txt”,”r”))==NULL){ printf(“File can’t be read\n”); exit(1); } char str[50]; fgets(str,50,fp); printf(“%s”,str); return 0; } text.txt包含: I am a boy\r\n 由于我在Windows上,它需要\ r \ n作为一个新的行字符,所以如果我从一个文件中读取它,它应该在str存储”I am a boy\n\0″ ,但我得到”I am a boy\r\n” 。 我正在使用mingw编译器。

使用gets 防止缓冲区溢出

gets的声明是: char * gets ( char * str ); 请注意str的最大尺寸的明显遗漏 。 cplusplus.com说2 : 请注意,gets与fgets完全不同:不仅使用stdin作为源,而且它不包括结果字符串中的结束换行符,并且不允许指定str的最大大小( 这可能导致缓冲区溢出 )。 并且: 最新版本的C标准(2011年)明确地将此function从其规范中删除。 该函数在C ++中已弃用(截至2011年标准,遵循C99 + TC3)。 当然,现在通常建议将fgets替换为gets ,因为它的声明如下所示: char * fgets ( char * str, int num, FILE * stream ); 它需要一个尺寸参数。 这使它比gets更安全。 既然我不愿意花钱去下载或购买C11 standard ,那么任何人都可以了解弃用gets的原因及其对未来代码的意义吗? 当fgets更安全时,为什么它存在于同一个地方? 为什么它只是刚刚被弃用?

在Eclipse中使用fgets(char * c,int i,file * f)和printf()for C – CDT。 输出顺序不正确。

#include enum { max_string = 127 }; static char ch[max_string+1] = “”; int main(int argc, char ** argv){ printf(“Type a String: \n”); fgets(ch, max_string, stdin); printf(“the string is: %s”, ch); return 0; } 我使用了这段代码,控制台中的输出是 hello world Type a String: the string is: hello world ‘hello world’是我给出的输入。 我的问题是为什么在这种情况下不保留订单。 因为printf()应该在fgets()之前工作,但是在这里它不是这样的。 我在Code :: Blocks中使用相同的编译器进行了检查。 它按顺序工作。 但是在Eclipse-MARS CDT的情况下,我发现它是错误的。

fgets()不等待输入

我写了以下代码: int N; scanf(“%d”, &N); int i; for (i = 0; i < N; i++) { char line[LINE_MAX]; if (fgets(line, LINE_MAX, stdin) != NULL) { // do stuff with line here printf("%c – %c\n", line[0], line[1]); } } 我有一个输入文件,它具有它拥有的行数,然后是我想要处理的行数。 所以我读了N行的行数。 在那之后,我使用fgets来获得能够处理它的线。 但是, fgets似乎并没有第一次等待stdin。 我总是输出- ,然后等待输入。 意思是,循环的第一次迭代,它不是在等待fgets标准输入,只是打印出两个空字符-由我的printf分隔。 这是为什么? 我怎样才能让fgets每次都等待输入? 我觉得这是一个线程问题。