我正在尝试复制文件,仅使用open()
,read()
和write()
向后打印。
但是我想知道是否有办法从读取中获取char指针,返回读取的字节数。如果是这样我怎么去做我尝试过一次,但我最终得到了一个错误
error: invalid type argument of ‘unary *’ (have ‘ssize_t’)
这是我正在使用的代码片段
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main (int argc, char *argv[])
{
if(argc != 3)/*argc should be 2 for correct execution*/
{
printf("usage: %s filename",argv[0]);
}
else
{
int file1 = open(argv[1], O_RDWR);
if(file1 == -1){
printf("\nfailed to open file.");
return 1;
}
int reversefile = open(argv[2], O_WRONLY, O_CREAT);
int size =(int)lseek(file1, 0, SEEK_END)+1;
char file2[size];
int count=size;
int i = 0;
while(read(file1, &file2[count], 1) != 0)
{
*file2[i]=*read(file1, file[count], 1);
write(reversefile, file2[i], size+1);
count--;
i++;
lseek(reversefile, i, SEEK_SET);
}
}
答案 0 :(得分:0)
read
返回一个size_t
值,表示成功读取了多少字节,它没有返回指针。
出于您的目的,您首先需要使用
致电read
read(file1, &file2[count], 1)
然后您可以通过
访问从文件中读取的值file2[i] = file[count];
我认为你不需要两次致电read
。
此外,如果您只需要一个字符,则使用getc
的字符更好。
char c;
while((c=getc(file1)) != EOF){
// use c
}
答案 1 :(得分:0)
您需要读取文件中的所有行并将其保存到字符串数组中。 这是一个包含100个字符串的数组,每个字符串最多可包含999个字符+ 1('\ 0')
char myfile[100][1000]
您需要反转字符串。这可以通过非常简单的算法完成。例如:如果你的字符串是“ABCDE”,你可以交换'A'和'E','B'和'D'。每当你用你的战利品获得strlen(myfile [i])/ 2并且你在第i个位置和(strlen(myfile [i]) - 1 - i-th)位置交换角色。
现在您可以在output.txt文件中写入所有字符串,但顺序相反。
#include <stdio.h>
#include <string.h>
char myfile[100][1000];
int n;
void readmyfile(void)
{
int i;
FILE *input = fopen("input.txt", "r");
printf("This is in your file:\n");
for(i = 0; fscanf(input, "%[^\n] ", myfile[i]) != EOF; i++)
printf("%s\n", myfile[i]);
n = i;
fclose(input);
}
void reverseall(void)
{
int i, j, len;
char swap;
for(i = 0; i < n; i++)
{
len = strlen(myfile[i]);
for(j = 0; j < len / 2; j++)
{
swap = myfile[i][j];
myfile[i][j] = myfile[i][len - 1 - j];
myfile[i][len - 1 - j] = swap;
}
}
}
void writetooutput(void)
{
int i;
FILE *output = fopen("output.txt", "w");
printf("This is your output file:\n");
for(i = n - 1; i >= 0; i--)
{
fprintf(output, "%s\n", myfile[i]);
printf("%s\n", myfile[i]);
}
fclose(output);
}
int main()
{
readmyfile();
reverseall();
writetooutput();
return 0;
}
答案 2 :(得分:0)
逆向?为了好玩,一个递归的解决方案。无需stat()
或seek()
。
注意ssize_t len = read(inf, buf, N);
。 len
,如果&gt; = 0是读取的字节数,则发生错误。 len
为0通常表示文件结束。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int read_R(int inf, size_t N) { // return 0 is good, else error
int result = 0;
char *buf = malloc(N);
if (buf == NULL) {
return -1; // Out of memory
}
ssize_t len = read(inf, buf, N);
if (len > 0) {
// read & print remainder of file
result = read_R(inf, N*2);
// print this buffer in reverse
while (len > 0) {
putchar(buf[--len]);
}
}
free(buf);
if (len < 0) { // Some I/O error, see errno
return 1;
}
return result;
}
// Usage
int inf = open(...);
if (read_R(inf, 4096)) {
; // error
}
else {
; // OK, every thing read and printed in reverse, memory free'd
}
close(inf);