来自数组的C文件阅读器

时间:2014-12-26 21:34:27

标签: c

我可以看到printf的最后y输出,但fpc变为空。

我怀疑fopen函数中有双引号,但找不到解决方案:如何解决?

部分代码;

char *y = &arr_lines[1024*2];

FILE *fpc = fopen(y, "r");

        if (fpc == NULL) {
                printf("Error opening file.\n");
                //return -1;
        }
printf("TEST %s\n",y);

当我运行代码时;

Error opening file.
TEST /Users/lessons/AbstractLesson.java

这是完整的代码;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define LINESIZE 1024
int main(void){

    char *arr_lines, *line;
    char buf_line[LINESIZE];
    int num_lines = 0;
    char buf[10240];

    // open file
    FILE *fp = fopen("/tmp/file", "r");
    //FILE *fp1 = fopen(arr_lines, "r");
    if (fp == NULL) {
            printf("Error opening file.\n");
            return -1;
    }
    // get number of lines; from http://stackoverflow.com/a/3837983
    while (fgets(buf_line, LINESIZE, fp))
            if (!(strlen(buf_line) == LINESIZE-1 && buf_line[LINESIZE-2] != '\n'))
                    num_lines++;
    // allocate memory
    arr_lines = (char*)malloc(num_lines * 1024 * sizeof(char));
    // read lines
    rewind(fp);
    num_lines = 0;
    line=arr_lines;
    while (fgets(line, LINESIZE, fp))
            if (!(strlen(line) == LINESIZE-1 && line[LINESIZE-2] != '\n'))
                    line +=  LINESIZE;
    // print first four lines
    char *y = &arr_lines[1024*2];

    FILE *fpc = fopen(y, "r");
        //FILE *fp1 = fopen(arr_lines, "r");
        if (fpc == NULL) {
                printf("Error opening file.\n");
                //return -1;
        }

printf("TEST [%s]\n",y);
     //x = &arr_lines[1024*0];
    // y = *x;

  // finish
    fclose(fp);
    return 0;

}

2 个答案:

答案 0 :(得分:1)

printf("TEST %s\n", y)更改为printf("TEST \"%s\"\n", y),以便我们查看文件名中是否有任何额外的空白字符。

fgets()会返回新行,如果有的话。我没看到你的代码清除换行符的位置。您的路径字符串是否包含新行?

除此之外,fopen()几乎肯定能正常工作。唯一的选择是1)路径不正确,2)路径有空格或其他无效字符,或3)文件无法读取。

如果您的路径中没有新行,那么您根本无法提供足够的信息来解决此问题。

答案 1 :(得分:0)

我怀疑路径/Users/lessons/AbstractLesson.java是错误的。它看起来像一个OSX路径,它可能缺少Userslessons之间的用户名。