就像我在标题中说的,我不知道如何在C中打印。txt文件的所有内容。下面是我做的一个不完全函数:
void
print_from_file(items_t *ptr,char filemane[25]){
char *string_temp;
FILE *fptr;
fptr=fopen(filemane, "r");
if(fptr){
while(!feof(fptr)){
string_temp=malloc(sizeof(char*));
fscanf(fptr,"n %[a-z | A-Z | 0-9/,.€#*]",string_temp);
printf("%sn",string_temp);
string_temp=NULL;
}
}
fclose(fptr);
}
我很确定fscanf中有错误,因为有时它不退出循环。
有人能纠正这个吗?
您使用malloc
错误。传递sizeof(char*)
到malloc
意味着你只给你的字符串的内存量,它会保持一个字符(数组)的指针。因此,当前,通过写入尚未分配的内存,会产生未定义的行为。对文件长度进行检查也是非常明智的,否则请确保您写入的字符串不会超过分配给它的长度。
应该这样做:
string_temp=malloc(100*sizeof(char)); // Enough space for 99 characters (99 chars + ' ' terminator)
代码中有几件事需要修复。首先,你应该经常检查一个文件是否被正确打开。
的例子:
FILE *fp; //file pointer
if((fp = fopen("file.txt", "r") == NULL) { //check opening
printf("Could not open file"); //or use perror()
exit(0);
}
另外,请记住scanf()和fscanf()返回它们已读取的元素数。因此,例如,如果一次扫描一个单词,则可以通过循环while fscanf(..) == 1来简化程序。
最后要注意的是,记住正确分配动态内存。你不希望根据指向char大小的指针分配内存,事实上,你想为字符串的每个字符分配1个字节,+ 1为结束符。的例子:
char name[55];
char * name2;
//To make them of the same size:
name2 = malloc(sizeof(*char)); **WRONG**
name2 = malloc(sizeof(char) * 55); //OK