fopen 不打开文件
fopen not opening File
我很确定这是打开文件的方式:
int readFile(char *filename){
char *source = NULL;
int fileSize;
char nameFile[strlen(filename)];
strcpy(nameFile,filename);
puts(nameFile);//Check if the string is correct
FILE *fp;
if ((fp =fopen(nameFile, "r")) != NULL) {
/* Go to the end of the file. */
if (fseek(fp, 0L, SEEK_END) == 0) {
/* Get the size of the file. */
long bufsize = ftell(fp);
if (bufsize == -1) { /* Error */ }
/* Allocate our buffer to that size. */
source = malloc(sizeof(char) * (bufsize + 1));
fileSize = (sizeof(char) * (bufsize + 1));
/* Go back to the start of the file. */
if (fseek(fp, 0L, SEEK_SET) != 0) { /* Error */ }
/* Read the entire file into memory. */
size_t newLen = fread(source, sizeof(char), bufsize, fp);
if (newLen == 0) {
fputs("Error reading file", stderr);
} else {
source[++newLen] = '[=10=]'; /* Just to be safe. */
}
}
fclose(fp);
} else{
printf("File Doesnt Exist. :( \n");
return 0;
}
所以,我在我的工作目录中。当我编译时,可执行文件是在文件所在的位置创建的。我做了一个 puts 来比较文件的名称。文件名(至于终端显示的是一样的);
我将 "r" 切换为 "r+",但我仍然发现我的文件不存在。
另外,我制作了 fopen("actualFileName.txt") 并且它确实有效......所以......有什么想法吗??
这就是我调用 readFile 的方式:
fgets(userInput,sizeof(userInput),stdin);
readFile(userInput);
这是错误的
char nameFile[strlen(filename)];
应该是
char nameFile[1 + strlen(filename)];
因为 strlen()
不包括终止 nul
字节,你的代码仍然非常危险,因为 filename
可能是 NULL
,在那种情况下,因为你永远不会检查然后在调用 strlen()
.
时会发生未定义的行为
这个
source[++newLen] = '[=12=]'; /* Just to be safe. */
是您知道字符串结尾需要 '[=21=]'
的证据。
所以你分配的内存比需要的少,因此问题,顺便说一句 sizeof(char) == 1
根据定义。
当您尝试通过输出来检查文件名时,请这样做
printf("*%s*\n", nameFile);
如果输出是这样的话,例如
*this_is_the_filename.txt
*
表示fgets()
读取的'\n'
还在缓冲区中,需要删除,使用fgets()
时可以这样
size_t length;
fgets(userInput, sizeof(userInput), stdin);
length = strlen(userInput);
if (userInput[userInput - 1] == '\n')
userInput[userInput - 1] = '[=15=]';
避免在字符串末尾有 '\n'
。
一期:
char nameFile[strlen(filename)];
应该是:
char nameFile[strlen(filename) + 1];
另一个潜在问题:
fgets(userInput,sizeof(userInput),stdin);
在 userInput 的末尾保留嵌入的任何行终止符(例如 - *nix 上的“\n”,Windows 上的“\r\n”)。这可能就是您无法打开文件的原因。尝试:
if (NULL == fgets(userInput,sizeof(userInput),stdin)) { /* handle error */ }
for (i = strlen(userInput); i > 0 && isspace(userInput[i]); --i);
userInput[i] = '[=13=]';
readFile(userInput);
此外,您可能会从以下位置获得有关 fopen 失败原因的更多信息:
perror("File Doesnt Exist. :( \n");
我很确定这是打开文件的方式:
int readFile(char *filename){
char *source = NULL;
int fileSize;
char nameFile[strlen(filename)];
strcpy(nameFile,filename);
puts(nameFile);//Check if the string is correct
FILE *fp;
if ((fp =fopen(nameFile, "r")) != NULL) {
/* Go to the end of the file. */
if (fseek(fp, 0L, SEEK_END) == 0) {
/* Get the size of the file. */
long bufsize = ftell(fp);
if (bufsize == -1) { /* Error */ }
/* Allocate our buffer to that size. */
source = malloc(sizeof(char) * (bufsize + 1));
fileSize = (sizeof(char) * (bufsize + 1));
/* Go back to the start of the file. */
if (fseek(fp, 0L, SEEK_SET) != 0) { /* Error */ }
/* Read the entire file into memory. */
size_t newLen = fread(source, sizeof(char), bufsize, fp);
if (newLen == 0) {
fputs("Error reading file", stderr);
} else {
source[++newLen] = '[=10=]'; /* Just to be safe. */
}
}
fclose(fp);
} else{
printf("File Doesnt Exist. :( \n");
return 0;
}
所以,我在我的工作目录中。当我编译时,可执行文件是在文件所在的位置创建的。我做了一个 puts 来比较文件的名称。文件名(至于终端显示的是一样的); 我将 "r" 切换为 "r+",但我仍然发现我的文件不存在。 另外,我制作了 fopen("actualFileName.txt") 并且它确实有效......所以......有什么想法吗??
这就是我调用 readFile 的方式:
fgets(userInput,sizeof(userInput),stdin);
readFile(userInput);
这是错误的
char nameFile[strlen(filename)];
应该是
char nameFile[1 + strlen(filename)];
因为 strlen()
不包括终止 nul
字节,你的代码仍然非常危险,因为 filename
可能是 NULL
,在那种情况下,因为你永远不会检查然后在调用 strlen()
.
这个
source[++newLen] = '[=12=]'; /* Just to be safe. */
是您知道字符串结尾需要 '[=21=]'
的证据。
所以你分配的内存比需要的少,因此问题,顺便说一句 sizeof(char) == 1
根据定义。
当您尝试通过输出来检查文件名时,请这样做
printf("*%s*\n", nameFile);
如果输出是这样的话,例如
*this_is_the_filename.txt
*
表示fgets()
读取的'\n'
还在缓冲区中,需要删除,使用fgets()
时可以这样
size_t length;
fgets(userInput, sizeof(userInput), stdin);
length = strlen(userInput);
if (userInput[userInput - 1] == '\n')
userInput[userInput - 1] = '[=15=]';
避免在字符串末尾有 '\n'
。
一期:
char nameFile[strlen(filename)];
应该是:
char nameFile[strlen(filename) + 1];
另一个潜在问题:
fgets(userInput,sizeof(userInput),stdin);
在 userInput 的末尾保留嵌入的任何行终止符(例如 - *nix 上的“\n”,Windows 上的“\r\n”)。这可能就是您无法打开文件的原因。尝试:
if (NULL == fgets(userInput,sizeof(userInput),stdin)) { /* handle error */ }
for (i = strlen(userInput); i > 0 && isspace(userInput[i]); --i);
userInput[i] = '[=13=]';
readFile(userInput);
此外,您可能会从以下位置获得有关 fopen 失败原因的更多信息:
perror("File Doesnt Exist. :( \n");