В вашей функции function
вы присваиваете адрес локальной переменной вашей структуре. После возвращения из function
этот адрес больше не действителен. Вы можете сделать это static
или распределить его динамически.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct s
{
char *value;
} S;
S list[2];
void function( )
{
char val1[] = "val1";
char val2[] = "val2";
//Note that you are creating a copy of "val1" here which can be avoided by changing it to char *val1 = "val1";
list[0].value = malloc(strlen(val1)+1); //allocate space for val1 + NUL-terminator
strcpy(list[0].value, val1); //copy string
list[1].value = malloc(strlen(val2)+1);
strcpy(list[1].value, val2);
//You could also use the function strdup which allocates memory and duplicates the string
//list[0].value = strdup(val1);
printf("%s\n", list[1].value); //prints val2
}
int main(int argc, char** argv)
{
function();
printf("%s", list[1].value);
free(list[0].value); //Don't forget to free.
free(list[1].value);
return 0;
}
Надо надеяться, это сохранит глаза Joel :)
@echo OFF
:: Get the number of lines in the file
set LINES=0
for /f "delims==" %%I in (data.txt) do (
set /a LINES=LINES+1
)
:: Print the last 10 lines (suggestion to use more courtsey of dmityugov)
set /a LINES=LINES-10
more +%LINES% < data.txt
Необходимо, вероятно, просто найти хорошую реализацию tail
. Но если Вы действительно действительно настоите на том, чтобы использовать пакетные файлы CMD и захотите работать на какой-либо в безопасности машине NT, то это будет работать:
@echo off
setLocal EnableDelayedExpansion
for /f "tokens=* delims= " %%a in (c:\tmp\foo.txt) do (
set var9=!var8!
set var8=!var7!
set var7=!var6!
set var6=!var5!
set var5=!var4!
set var4=!var3!
set var3=!var2!
set var2=!var1!
set var1=!var!
set var=%%a
)
echo !var9!
echo !var8!
echo !var7!
echo !var6!
echo !var5!
echo !var4!
echo !var3!
echo !var2!
echo !var1!
echo !var!
Если файл является слишком большим, может занять слишком много времени добираться, количество строк иначе должно использовать, находят и не передают его никуда строка
$find /v /c "%%$%!" yourtextfile.txt
, это закончилось бы вывод как это
$---------- yourtextfile.txt: 140
тогда, можно проанализировать выходное использование для подобного это
$for /f "tokens=3" %i in ('find /v /c "%%$%!" tt.txt') do set countoflines=%i
тогда, Вы можете substract десять строк от общих строк
Существует несколько реализаций окон команды хвоста. Это должно быть точно, что Вы хотите.
Эти особенно хорошие звуки: http://malektips.com/xp_dos_0001.html
Они колеблются от контроля в реальном времени до последних x строк файла.
Редактирование: Я заметил, что включенная ссылка к пакету, Она должна работать, но здесь является еще некоторыми версиями:
http://www.lostinthebox.com/viewtopic.php?f=5&t=3801 http://sourceforge.net/projects/tailforwin32
Есть идеи, как повторить или ввести последнее 10 строк текстового файла?
Следующий трехстрочный скрипт перечислит последние n строк из входного файла. n и имя файла / путь передаются в качестве входных аргументов.
# Script last.txt
var str file, content ; var int n, count
cat $file > $content ; set count = { len -e $content } - $n
stex -e ("["+makestr(int($count))) $content
Сценарий находится в битовом сценарии. Для использования загрузите битерскриптинг с http://www.biterscripting.com , сохраните этот скрипт как C: \ Scripts \ last.txt, запустите битерскриптинг, введите следующую команду.
script last.txt file("c:\log09.txt") n(10)
Выше будет список последние 10 строк из файла c: \ log09.txt. Чтобы вывести список последних 20 строк из того же файла, используйте следующую команду.
script last.txt file("c:\log09.txt") n(20)
Чтобы вывести список последних 30 строк из другого файла C: \ folder1 \ somefile.log, используйте следующую команду.
script last.txt file("C:\folder1\somefile.log") n(30)
Я написал сценарий в довольно общий способ, поэтому его можно использовать по-разному. Не стесняйтесь переводить на другой язык сценариев / пакетной обработки.