所以我想创建一个名为genData.c的文件,例如执行时:./ genData filename.txt会将1个字符写入该文件1000次。
本质上是创建1kb文件。 我希望能够修改for循环,比如100000次,生成1MB文件等等。
这是我尝试过的,它编译但是在执行时会导致分段错误。
有什么建议吗?对不起C是我从未涉足过的语言。
#include <stdio.h>
int main (int argc, char *argv) {
char ch = 'A';
FILE *fp;
fp = fopen(argv[1], "wb");
int i;
for (i = 0; i < 1000; i++) {
fwrite(&ch, sizeof(char), 1, fp);
}
fclose(fp);
return 0;
}
答案 0 :(得分:5)
如果您使用警告进行编译,则会得到有关确切问题的提示:
test.c:3:5: warning: second argument of ‘main’ should be ‘char **’ [-Wmain]
int main (int argc, char *argv) {
^
所有麻烦都从此错误的下游开始。修复此参数,您的代码将起作用。
将来,养成打开警告的编译习惯:
$ gcc -Wall foo.c
...
这将有助于捕捉可能导致问题的拼写错误和其他奇怪现象。
答案 1 :(得分:0)
由于您将其标记为Linux,因此您可以使用系统级函数来执行此操作(这应该是一种正确,最有效的方法):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sysexits.h>
#include <fcntl.h>
#include <string.h>
ssize_t /* Write "n" bytes to a descriptor */
writen(int fd, const void *ptr, size_t n);
int
main (int argc, char** argv) {
char buf[1000];
memset(buf, 'A', sizeof(buf));
int fd;
if((fd = open(argv[1], O_WRONLY|O_CREAT, 0666))<0){
perror(argv[1]);
exit(EX_NOPERM);
}
ssize_t left = writen(fd, buf, sizeof(buf));
if(left)
perror("write error\n");
return !!left;
}
ssize_t /* Write "n" bytes to a descriptor */
writen(int fd, const void *ptr, size_t n) {
size_t nleft;
ssize_t nwritten;
nleft = n;
while (nleft > 0) {
if ((nwritten = write(fd, ptr, nleft)) < 0) {
if (nleft == n)
return(-1); /* error, return -1 */
else
break; /* error, return amount written so far */
} else if (nwritten == 0) {
break;
}
nleft -= nwritten;
ptr += nwritten;
}
return(n - nleft); /* return >= 0 */
}
答案 2 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
#define SIZE_OF_FILE 1024
int main(int argc, char *argv[])
{
FILE *fdest;
char ch = '\n';
if(argc != 2)
exit(EXIT_FAILURE);
fdest = fopen(argv[1], "wb");
if (fdest == NULL)
exit(EXIT_FAILURE);
fseek(fdest, SIZE_OF_FILE - 1, SEEK_CUR);
fwrite(&ch, sizeof(char), 1, fdest);
fclose(fdest);
return 0;
}
本质上是创建1kb文件
如果唯一的目的是创建一个sizeof x的文件,我相信它会更简单。