无法统计文件 - c
could not stat file - c
我需要对文件进行统计以获取其大小。我还需要提供文件名作为命令行参数。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
int main (int argc, char* argv[])
{
int N = 300;
int L = 1000;
char Nseq[N][L];
FILE *myfile;
char *token;
const char s[2] = ",";
char *line;
int lenline;
char filename[100];
strcpy(filename, "/path/");
char name[100];
strcpy(name, argv[1]);
strcat(filename, name);
strcat(filename, ".txt");
printf("%s\n", filename);
int err;
struct stat st;
int n = 0;
err = stat(filename,&st);
if (err < 0) {
printf("could not stat file %s", filename);
exit(1);
}
lenline = st.st_size + 1;
line = malloc(lenline);
myfile = fopen(filename, "r");
if (myfile == NULL) {
printf("could not open file %s", filename);
exit(1);
}
while (fgets(line, lenline, myfile) != NULL) {
token = strtok(line, s);
while (token != NULL && n<N) {
strcpy(Nseq[n], token);
printf("%s\t%u\n", token, n);
token = strtok(NULL, s);
n++;
}
}
fclose(myfile);
return 0;
}
我得到的输出是:
/path/file.txt
could not stat file /path/file.txt
有谁知道为什么会这样?
我该如何解决?
谢谢!
stat
(2) 的手册页说:成功时,返回零 (0
)。出错时,返回 -1
,并适当设置 errno
。
您实际上并没有使用 errno
并且基本上导致您自己的错误消息成为 "something went wrong".
的一个相当无用的变体
实际使用 errno
,隐式调用
perror("stat");
或明确调用
fprintf(stderr, "could not stat file %s: %s", filename, strerror(errno));
最有可能的潜在问题是您在 /path
之前并附加 .txt
并且在调用 stat
之前构建的路径中没有实际文件.如果您只关注成功 stat
文件,试试这个:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
int main (int argc, char** argv) {
const char* filename = argv[1];
printf("Calling stat(%s)...", filename);
int err;
struct stat st;
err = stat(filename, &st);
if (err < 0) {
printf("failed with error %d (%s)\n", err, strerror(errno));
return err;
} else {
printf("succeeded\n");
return 0;
}
}
至少您会明白 stat
失败的确切原因,这将有助于说明您的代码为何无法正常工作。
我需要对文件进行统计以获取其大小。我还需要提供文件名作为命令行参数。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
int main (int argc, char* argv[])
{
int N = 300;
int L = 1000;
char Nseq[N][L];
FILE *myfile;
char *token;
const char s[2] = ",";
char *line;
int lenline;
char filename[100];
strcpy(filename, "/path/");
char name[100];
strcpy(name, argv[1]);
strcat(filename, name);
strcat(filename, ".txt");
printf("%s\n", filename);
int err;
struct stat st;
int n = 0;
err = stat(filename,&st);
if (err < 0) {
printf("could not stat file %s", filename);
exit(1);
}
lenline = st.st_size + 1;
line = malloc(lenline);
myfile = fopen(filename, "r");
if (myfile == NULL) {
printf("could not open file %s", filename);
exit(1);
}
while (fgets(line, lenline, myfile) != NULL) {
token = strtok(line, s);
while (token != NULL && n<N) {
strcpy(Nseq[n], token);
printf("%s\t%u\n", token, n);
token = strtok(NULL, s);
n++;
}
}
fclose(myfile);
return 0;
}
我得到的输出是:
/path/file.txt
could not stat file /path/file.txt
有谁知道为什么会这样? 我该如何解决? 谢谢!
stat
(2) 的手册页说:成功时,返回零 (0
)。出错时,返回 -1
,并适当设置 errno
。
您实际上并没有使用 errno
并且基本上导致您自己的错误消息成为 "something went wrong".
实际使用 errno
,隐式调用
perror("stat");
或明确调用
fprintf(stderr, "could not stat file %s: %s", filename, strerror(errno));
最有可能的潜在问题是您在 /path
之前并附加 .txt
并且在调用 stat
之前构建的路径中没有实际文件.如果您只关注成功 stat
文件,试试这个:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/stat.h>
int main (int argc, char** argv) {
const char* filename = argv[1];
printf("Calling stat(%s)...", filename);
int err;
struct stat st;
err = stat(filename, &st);
if (err < 0) {
printf("failed with error %d (%s)\n", err, strerror(errno));
return err;
} else {
printf("succeeded\n");
return 0;
}
}
至少您会明白 stat
失败的确切原因,这将有助于说明您的代码为何无法正常工作。