我必须编写一个函数,它接受一个char指针作为参数(文件名的字符串),并一次读入一个字的文件。到目前为止,这是我的代码:
void processText(char * filename)
char tmpWord[30];
char tmpFile[200];
char * word;
FILE *fp;
index = 0;
strcpy(tmpFile, filename);
printf("%s\n\n", tmpFile);
fp = fopen(filename, "r");
if (fp == NULL)
{
printf("Sorry, file does not exist.\n");
exit(EXIT_FAILURE);
}
while (fscanf(fp, "%s", tmpWord) != EOF)
{
printf("%s\n", tmpWord);
}
fclose(fp);
当我运行程序传入字符串" test.txt"它输出:
test.txt
Sorry, file does not exist.
如果没有if NULL,则只需在打印test.txt后进行段错误。
如果有帮助,当我输入" test.txt"进入fopen而不是完美运行,所以我知道文件路径是正确的。
答案 0 :(得分:1)
我建议您尝试打印出filename
引号或其他分隔字符,#
或许?这将显示您的filename变量中是否有任何尾随空白字符。如果有空格字符,则可能无法找到您的文件,因为它正在寻找"test.txt "
而不是"test.txt"
。
答案 1 :(得分:1)
将文件名传递给用于打开和阅读的功能时,需要考虑许多事项。您不仅需要验证 fopen
调用,而且在达到这一点之前,您应该验证filename
是指向有效地址的指针,而不是{{ 1}}指针。此外,由于您已声明NULL
,您应该(1)将数组初始化为零,并且(2 - 更重要的是),将char tmpWord[30];
读取的字大小限制为fscanf
个字符确保29
包含tmpWord
字符串。
将各个部分放在一起,您可以使用以下null-terminated
:
processText
从void processText (char *filename)
{
if (!filename) { /* validate filename not NULL */
fprintf (stderr, "processText() error: invalid argument.\n");
exit(EXIT_FAILURE);
}
char tmpWord[30] = {0}; /* initialize variables */
FILE *fp = fopen (filename, "r");
if (!fp) { /* validate file is open */
fprintf (stderr, "processText() error: file open failed '%s'.\n",
filename);
exit(EXIT_FAILURE);
}
printf ("\n reading words from : %s\n\n", filename);
/* read a maximum of 29 chars in each word into tmpWord & print */
while (fscanf (fp, " %29s", tmpWord) != EOF)
printf(" %s\n", tmpWord);
putchar ('\n');
fclose(fp);
}
调用processText
的简单示例可能是:
main()
测试输入/输出为:
<强>输入强>
#include <stdio.h>
#include <stdlib.h>
void processText (char *filename);
int main (int argc, char **argv) {
if (argc < 2) { /* validate one argument given */
fprintf (stderr, "error: insufficient input, usage: %s filename.\n",
argv[0]);
return 1;
}
processText (argv[1]);
return 0;
}
<强>输出强>
$ cat dat/captnjack.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.
如果您有任何其他问题,请告诉我,我们乐意为您提供帮助。