在C

时间:2015-11-20 04:31:35

标签: c file pointers io segmentation-fault

我必须编写一个函数,它接受一个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而不是完美运行,所以我知道文件路径是正确的。

2 个答案:

答案 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.

如果您有任何其他问题,请告诉我,我们乐意为您提供帮助。