我有以下代码:
while (fgets(line,1024,file))
{
getchar();
printf(line);
i++;
line = (char*)realloc(line, sizeof(char)*sizes[i]);
}
由于某种原因,当我打印该行时,它会打印两行。 怎么会这样?
完整代码:
int main()
{
FILE * file = fopen("C:/Users/user/Desktop/a.txt","r");
char c;
int count=0;
int words=0;
int* sizes = (int*)calloc (count+1,sizeof(int));
if (file)
{
do
{
c= getc(file);
words++;
if (c=='\n'|| c==EOF)
{
sizes[count]=words+1;
count++;
words=0;
if (c=='\n')
sizes = (int*)realloc(sizes,(count+1)*sizeof(int));
}
}while (c!=EOF);
rewind(file);
char* line = (char*)malloc(sizeof(char)*(sizes[0]));
int i=0;
while (fgets(line,1024,file))
{
getchar();
printf("%s",line);
i++;
line=(char*)realloc(line,sizeof(char)*sizes[i]);
}
printf(line);
free(line);
/*for (int i=0; i<8; i++)
{
printf("%d\n",sizes[i]);
}*/
free(sizes);
fclose(file);
}
getchar();
return 0;
}
如你所见,我计算每一行的长度,将其放入数组,而不是根据行的长度分配一个字符串。
答案 0 :(得分:1)
你有一个额外的
printf(line);
在while
循环之后,导致最后一行打印两次。
如果您将内部循环中的打印更改为
printf("read[%d]: %s", i, line);
它会更加明显。相同的i
不会被打印两次。如果您有一个奇怪的控制序列,如\v\r
,但输出可能看起来在中间有一个换行符,但它仍然是相同的&#34; line&#34;正在印刷
答案 1 :(得分:1)
如果你只是按&#34;输入&#34;在getchar
,会有一行。
如果您输入1个字母并输入,则会有2行。
如果输入2个字母并输入则会有3行
看看我要去哪里。你的输入在&#34;输入&#34;但getchar
对一个字符感到满意,另一个字符在缓冲区中,它在下一个循环中得到。
total 192
1 <---------input
-rw-rw-r-- 1 nranjan3 nranjan3 1032 Jun 11 2013 parseCreateList.c
-rw-rw-r-- 1 nranjan3 nranjan3 462 Jun 14 2013 mpSpRec.c
12 <---------input
-rwxrwxr-x 1 nranjan3 nranjan3 8681 Jun 14 2013 mpSpRec.exec
-rw-rw-r-- 1 nranjan3 nranjan3 162 Jul 29 2013 mtTrace.log
-rw-rw-r-- 1 nranjan3 nranjan3 1280 Jul 29 2013 iccLogger.c
123 <---------input
-rwxrwxr-x 1 nranjan3 nranjan3 6662 Aug 20 2013 k.out
-rw-rw-r-- 1 nranjan3 nranjan3 1465 Aug 21 2013 stNewProcPar.c
-rwxrwxr-x 1 nranjan3 nranjan3 11624 Aug 21 2013 masterP
-rw-rw-r-- 1 nranjan3 nranjan3 321 Nov 25 2013 memTest.c
现在代替getchar你添加它,它将工作并显示1行,无论你键入多少字母
while (getchar() != '\n');
答案 2 :(得分:0)
如果您在询问代码中的额外新行,那么您可能需要去除getchar()函数。由于这个原因,它只是在新行中等待,当你输入时,你可以看到文件中的下一行。但是,您看起来像输出中的额外行。所以交换功能:
getchar();
使用:
getch();
我希望你能得到答案。
答案 3 :(得分:0)
char c;
应为int c;
。由于EOF
必须与所有可能的字符不同,因此,如果您使用char c;
,则要么找不到EOF
,要么得到误报,具体取决于系统的char
格式
继续前进:
while (fgets(line,1024,file))
将1024
替换为sizes[i]
。这样可以防止缓冲区溢出。
{
getchar();
getchar()
会丢弃下一行的第一个字符。但是,如果下一行为空,则表示丢弃整个下一行。然后,您的行计数将与您正在阅读的行不同步(如果您仍在1024
中使用fgets
,则会导致未定义的行为,这可以解释为什么您会看到虚假输出。)
i++;
如果i >= count
,你应该摆脱循环。
正如其他人所说,循环后printf(line);
表示最后一行打印两次(如果包含任何%
个字符,则会出现乱码)。
最后,don't cast malloc。除了使代码更加健壮之外,还可以使代码更容易阅读。您不需要sizeof(char)
,因为它总是1
。
NB。在你去的时候读取线条要好得多,而不是在文件上进行两次传递。