我从C联机帮助页了解到,使用fgets()
会在EOF
或换行符之后停止读取。我有一个程序可以从文件中读取(多行),并在新行的末尾停止读取。
是否有一种方法可以强制fgets()
忽略换行符并阅读直到EOF
?
while(fgets(str,1000, file))
{
// i do stuffs with str here
}
答案 0 :(得分:1)
是否有一种方法可以强制
fgets()
忽略换行符并读到EOF
?
不,您不能这样做,因为实现fgets()
的方式是如果发生文件结束或换行符已找到。也许您可以考虑使用其他文件I / O功能,例如fread()
。
答案 1 :(得分:1)
在while循环中,您必须进行以下检查:
while ((fgets(line, sizeof (line), file)) != NULL)
成功后,函数将返回相同的str参数。如果遇到文件末尾且未读取任何字符,则str的内容保持不变,并返回空指针。 如果发生错误,则返回空指针。
代码示例:
#include <stdio.h>
int main()
{
char *filename = "test.txt";
char line[255];
FILE *file;
file = fopen(filename, "r");
while ((fgets(line, sizeof (line), file)) != NULL) {
printf("%s", line);
}
fclose(file);
return 0;
}
答案 2 :(得分:0)
否,fgets
在遇到\ n(换行符)字符后停止阅读。
否则,您必须自己找到并删除换行符。
Or you can use fread
:
C库函数size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)将给定流中的数据读入数组 由ptr指出。
成功读取的元素总数返回为 size_t对象,它是整数数据类型。如果这个数字不同 从nmemb参数开始,则发生错误或结束 已达到文件总数。
/* fread example: read an entire file */
#include <stdio.h>
#include <stdlib.h>
int main () {
FILE * pFile;
long lSize;
char * buffer;
size_t result;
pFile = fopen ( "myfile.bin" , "rb" );
if (pFile==NULL) {fputs ("File error",stderr); exit (1);}
// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
// allocate memory to contain the whole file:
buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
// copy the file into the buffer:
result = fread (buffer,1,lSize,pFile);
if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
/* the whole file is now loaded in the memory buffer. */
// terminate
fclose (pFile);
free (buffer);
return 0;
}